【问题标题】:Set dataframe row value to a numpy array value将数据框行值设置为 numpy 数组值
【发布时间】:2020-02-29 09:12:01
【问题描述】:

原帖的编辑版本

我有一个完全用 NaN 填充的数据框。具体来说:

print(histPrice['Allocation %'])

[Output]: 
 Symbols    SPY  GLD  TLT   MA   QQQ      TIP
Date                                         
2019-11-01  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-31  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-30  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-29  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-28  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-25  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-24  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-23  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-22  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-21  NaN  NaN  NaN   NaN  NaN      NaN
2019-10-18  NaN  NaN  NaN   NaN  NaN      NaN

我有以下numpy 数组:

x = np.array([0.1,0.3,0.2,0.1,0.1,0.2])

我尝试通过以下方式将数组分配给 2019-10-30 行:

histPrice['Allocation %'].iloc[2] = x 

还有

histPrice['Allocation %'].iloc[2,:] = x

然而,两者都导致:

print(histPrice['Allocation %'].iloc[2])

[Output]: 
 Symbols
SPY       NaN
GLD       NaN
TLT       NaN
MA        NaN
QQQ       NaN
TIP       NaN
Name: 2019-10-30 00:00:00, dtype: float64 

我很困惑为什么它仍在输出NaN。任何帮助将不胜感激。

【问题讨论】:

  • 你想用 np 数组替换表格的第三行吗?
  • @Tserenjamts 我只是想用数组替换特定行
  • histPrice 是什么类型的?
  • @aprilangel histPrice is 'pandas.core.frame.DataFrame'
  • @Drive2blue 但看起来 histPrice['Allocation %'] 也是一个数据框

标签: python pandas dataframe numpy


【解决方案1】:

你应该这样做

df.iloc[2,:]=a[0]
df
Out[142]: 
        Stock: Bond: Gold:
2/01/19    NaN   NaN   NaN
1/31/19    NaN   NaN   NaN
1/30/19    33%   33%   33%
1/29/19    NaN   NaN   NaN

【讨论】:

  • 这不起作用。请参阅我更新后的帖子中的“其他详细信息”部分
【解决方案2】:

如果你想用你的 numpy 数组更新整行,你应该可以使用:

x = np.array([2,3,1])
df.iloc[2]= x

        Stock Bond Gold
2/01/19   NaN  NaN  NaN
1/31/19   NaN  NaN  NaN
1/30/19     2    3    1
1/29/19   NaN  NaN  NaN

这将使用数组的每个值更新行,而不仅仅是第一个值。

我很好奇这对你有用吗?

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['Stock','Bond','Gold'], index=['2/01/19','1/31/19','1/30/19','1/29/19'])
histPrice = {}
histPrice['Allocation %'] = df
x = np.array([2,3,1])
histPrice['Allocation %'].iloc[2] = x 
print(histPrice['Allocation %'].iloc[2])

【讨论】:

  • 这不起作用。请参阅我更新后的帖子中的“其他详细信息”部分
  • @drive2blue 看起来您正在尝试将数组分配给一列 histPrice['Allocation %'],而不是一行。
  • @drive2blue 你有保存在字典中的数据框吗?
  • @Drive2blue 根据您更新的问题,我想知道您是否有一个或多个数据帧存储在字典中。您是否有可能更新了错误的数据框(我之所以问,是因为您在更新的问题中引用了两个不同的数据框: histPrice['Allocation %'], histPrice['RP Allocation %'])?
  • @Drive2blue 我想知道是否有嵌套的数据框,我什至正在研究将数据框存储在数据框内,因为这对我来说是一个新概念。我很高兴我仍然能够提供帮助。
【解决方案3】:

根据描述,您将数据帧存储在另一个单行数据帧中。

并且在执行以下操作时,您正在数据框的副本中设置一个值。

histPrice['Allocation %'].iloc[2] = x 

请尝试:(您可以将 0 替换为您的索引)

histPrice.loc[0, 'Allocation %'].iloc[2] = x

【讨论】:

  • 嗯,我尝试了你的建议,但得到了KeyError: 'Allocation %' 相反,我尝试了histPrice.loc[ : , 'Allocation %'].iloc[2] = x,但结果是ValueError: setting an array element with a sequence :(
  • @Drive2blue 不要使用数组,将 x 设置为列表。应该没问题=)
【解决方案4】:

您需要loc 索引为df.index

histPrice.loc[df.index[2], 'Allocation %'] = x 

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 2019-05-22
    • 2023-03-07
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多