【问题标题】:Pandas data frame (df) groupby with user defined function that uses df row and columnPandas 数据框 (df) groupby 具有使用 df 行和列的用户定义函数
【发布时间】:2018-07-06 22:31:54
【问题描述】:

我创建了一个数据框 (df) 来存储以下信息,HS1 是索引。

HS1 HS2 EffNotional_UnMG
EUR 3   -10082.91381
USD 2   -36253.84938
USD 3   78693.86806

现在我想在这个数据帧上应用两个迭代:外部由 HS1 和内部由 HS2 以获得两个字典(已经用默认值声明),如下所示: 对于欧元:{'2': 20000.00,'3':0} [密钥 3 的默认值为 0] 对于美元:{'2': -36253.84938, '3':78693.86806}

我使用 itertuple 并为外部迭代获得以下输出:

for row in df.itertuples():
print (row)

Pandas(Index='EUR', HS2=3, EffNotional_UnMG=-10082.913813053281)

Pandas(Index='USD', HS2=2, EffNotional_UnMG=-36253.849384403635)

Pandas(Index='USD', HS2=3, EffNotional_UnMG=78693.868057473315)

能否指导使用 itertuples 进行内部迭代。

【问题讨论】:

标签: python pandas dataframe user-defined


【解决方案1】:

我认为循环不是必需的,使用pivot + fillna + to_dict

d = df.pivot('HS2','HS1','EffNotional_UnMG').fillna(0).to_dict()

set_index + unstack + to_dict 的替代解决方案:

d = df.set_index(['HS2','HS1'])['EffNotional_UnMG'].unstack(fill_value=0).to_dict()

print (d)
{'EUR': {'2': 0.0, '3': -10082.91381}, 'USD': {'2': -36253.84938, '3': 78693.86806000001}}

【讨论】:

  • 我不明白,您能否创建具有预期输出的数据并解释为什么它不起作用?
  • itertuple 解决方案仍然很有帮助。共享解决方案很棒。然而,字典有一个强制键为“1”,在以后的计算中需要它和其他键。我们如何介绍在 pivot 中遗漏的键?添加缺失键(1 或 2 或 3)必须是动态的。非常感谢。使用的公式是 Addon=sqrt(d['1']**2+d['2']**2+d['3']**2+1.4*d['1']*d[' 2']+1.4*d['2']*d['3']+0.6*d['1']*d['3'])
  • pivot 用于为所有缺失值添加0。没有数据真的很接近给你很好的答案 - 你需要什么;)
  • 我将丢失的部分管理为: d2.update((missing,0) for missing in set(lst).difference(d2)) 其中 lst 是一个包含 1,2 和 3 和 d2 的列表是每个键的子字典
  • 对于 d.items() 中 x,y 的每种货币,得到以下答案: d2=y print (x) d2.update((missing,0) for missing in set(lst)。差异(d2))打印(d2)插件=sqrt(d2[1]**2+d2[2]**2+d2[3]**2+1.4*d2[1]*d2[2]+1.4 *d2[2]*d2[3]+0.6*d2[1]*d2[3]) 打印(插件)EUR {2: 0.0, 3: -10082.913813053281, 1: 0} 10082.913813053281 USD {2: -36253.849384403635, 3:78693.868057473315,1:0} 59269.9634637104
猜你喜欢
  • 2020-06-14
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2017-05-10
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多