python - 将字典从特定索引号附加到 pandas 数据帧

标签 python pandas numpy for-loop data-science

我在 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/

相关文章:

python - 超出 Django 最大递归深度

python - 使用Python获取硬盘温度

python - 如何用 python 创建 $2y$14 的河豚哈希?

python - pandas - 获取未排序的分层列

python - 在 Pandas/Pyspark 中比较 2 个数据帧、分配标签并拆分行

python - 加速 Kronecker 产品 Numpy

Python:这是在 Pandas 数据框中查找索引的快速方法?

python - 根据两列进行排序并将值分配给新列

python - 删除 numpy 数组中的孤立单元格

python - 非零值的 Numpy 总和运行长度