我在 Pandas DataFrame 中有 2 列和一个字典生成器函数,该函数从数据帧滚动索引中获取输入并将输出作为字典给出,然后它应该将键作为列和值作为行添加到现有的 pandas 数据帧中一个具体的指标。示例数据帧是:
+-------+---+---+
| Index | A | B |
+-------+---+---+
| 0 | 2 | 4 |
| 1 | 5 | 6 |
| 2 | 1 | 7 |
| 3 | 4 | 6 |
| 4 | 2 | 7 |
| 5 | 8 | 4 |
| 6 | 3 | 1 |
| 7 | 8 | 2 |
+-------+---+---+
从数据框中获取输入行(窗口)的代码如下:
def stack(df, window=3):
for i in range(0, df.shape[0] - window):
dfp = df[i:i+window]
mp = addition(dfp) #a dict generator function to add 3 previous values of column a and b and give output with a single dict {'C': value, 'D': value}
for key, value in mp.items(): # to assign keys as column and values as rows
df.loc['i+window', key] = value # to assign rows from a specific index -3
return df
for-loop 函数在每个循环中生成 1 个字典,如下所示:
{'C': 8, 'D': 17} #1st loop
{'C': 10, 'D': 19} #2nd loop
{'C': 7, 'D': 20} #3rd loop
{'C': 14, 'D': 17} #4th loop
{'C': 13, 'D': 12} #5th loop
但是,当应用上述较慢的函数使除最后一行之外的每一行值都为 NaN 时,输出会出现错误。我希望预期的输出应该在每个循环中逐行添加到数据帧中,最终的数据帧应如下所示:
+-------+---+---+-----+-----+
| Index | A | B | C | D |
+-------+---+---+-----+-----+
| 0 | 2 | 4 | NaN | NaN |
| 1 | 5 | 6 | NaN | NaN |
| 2 | 1 | 7 | 8 | 17 |
| 3 | 4 | 6 | 10 | 19 |
| 4 | 2 | 7 | 7 | 20 |
| 5 | 8 | 4 | 14 | 17 |
| 6 | 3 | 1 | 13 | 12 |
+-------+---+---+-----+-----+
除了上述预期输出之外,我还想让循环尽可能快。请让我明白我哪里出了问题并原谅我糟糕的英语..
最佳答案
另一种替代循环的选项:
df.combine_first(pd.DataFrame(dd_list, index=range(window,len(dd_list)+window)))
更新我认为您所要求的向数据框添加字典的内容:
dd_list = [{'C': 8, 'D': 17}, #1st loop
{'C': 10, 'D': 19}, #2nd loop
{'C': 7, 'D': 20}, #3rd loop
{'C': 14, 'D': 17}, #4th loop
{'C': 13, 'D': 12}, ]
window = 2
for n, i in enumerate(dd_list):
df = df.combine_first(pd.DataFrame(i, index=[n+window]))
print(df)
输出:
A B C D
0 2 4 NaN NaN
1 5 6 NaN NaN
2 1 7 8.0 17.0
3 4 6 10.0 19.0
4 2 7 7.0 20.0
5 8 4 14.0 17.0
6 3 1 13.0 12.0
7 8 2 NaN NaN
<小时/>
正如@QuangHoang所建议的,要生成输出,您可以使用以下方法来执行此操作:
df.join(df.rolling(3).sum().rename(columns={'A':'C', 'B':'D'}))
输出:
A B C D
Index
0 2 4 NaN NaN
1 5 6 NaN NaN
2 1 7 8.0 17.0
3 4 6 10.0 19.0
4 2 7 7.0 20.0
5 8 4 14.0 17.0
6 3 1 13.0 12.0
7 8 2 19.0 7.0
关于python - 将字典从特定索引号附加到 pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60191732/