gpt4 book ai didi

python - 添加计算列,然后将新数据迭代地添加到 Pandas 数据框(python 3.7.1)

转载 作者:太空狗 更新时间:2023-10-30 01:10:56 26 4
gpt4 key购买 nike

我有一个初始数据框 df1:

    df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])

a b c d e
0 1 B C D E
1 2 B C D E
2 3 B C D E
3 4 B C D E
4 5 B C D E

然后我根据 df1 列值计算一些新参数,创建一个新的 df2 并在列名称“a”上与 df1 合并。

    df2 = pd.DataFrame(np.array([[1, 'F', 'G'], [2, 'F', 'G']]), columns=['a', 'f', 'g'])

a f g
0 1 F G
1 2 F G
    df1 = pd.merge(df1, df2,  how='left', left_on=['a'], right_on = ['a'])

a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E NaN NaN
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN

这工作得很好,但在另一个循环事件中,我创建了一个与 df2 具有相同列的 df3,但在这种情况下合并不起作用,它没有考虑到相同的列已经在 df1 中。

重要提示:这仅用于说明目的,将添加数千个新数据帧,每个循环步骤一个。

    df3 = pd.DataFrame(np.array([[3, 'F', 'G']]), columns=['a', 'f', 'g'])

a f g
0 3 F G
df1 = pd.merge(df1, df3,  how='left', left_on=['a'], right_on = ['a'])

a b c d e f_x g_x f_y g_y
0 1 B C D E F G NaN NaN
1 2 B C D E F G NaN NaN
2 3 B C D E NaN NaN F G
3 4 B C D E NaN NaN NaN NaN
4 5 B C D E NaN NaN NaN NaN

我只是使用现有的列来填补缺失的空白。此方法创建新列 (f_x, g_x, f_y, g_y)

Append 和 contact 也不起作用,因为它们会重复信息(“a”上的重复行)。

关于如何解决这个问题有什么建议吗?将 df1df2 合并后的最终结果 应为:

        a   b   c   d   e   f   g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E F G
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN

最终所有的列都将在循环期间被填充,所以第一个添加的(df2)将添加新的列,并且从 df3 开始只是新数据来填充所有 NaN。循环看起来像这样:

df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
for num, item in enumerate(df1['a']):
#compute df[num] (based on values on df1)
df1 = pd.merge(df1, df[num], how='left', left_on=['a'], right_on = ['a'])

最佳答案

一个可能的解决方案是 concat所有小的DataFrame,然后只有一次merge:

df4 = pd.concat([df2, df3])
print (df4)
a f g
0 1 F G
1 2 F G
0 3 F G

df1 = pd.merge(df1, df4, how='left', on = 'a')
print (df1)
a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E F G
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN

另一种可能的解决方案是使用 DataFrame.combine_firstDataFrame.set_index :

df1 = (df1.set_index('a')
.combine_first(df2.set_index('a'))
.combine_first(df3.set_index('a')))
print (df1)
b c d e f g
a
1 B C D E F G
2 B C D E F G
3 B C D E F G
4 B C D E NaN NaN
5 B C D E NaN NaN

关于python - 添加计算列,然后将新数据迭代地添加到 Pandas 数据框(python 3.7.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com