gpt4 book ai didi

python - 根据列表长度合并2个数据帧(使用Pandas)

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:22 25 4
gpt4 key购买 nike

我有一个数据帧df1,如下所示:

import pandas as pd
import numpy as np
dic1 = {'A':['a','b','c','d','e'],
'B':[np.nan,np.nan,np.nan,150,np.nan],
'C':['x','y','z','v','w']}
df1 = pd.DataFrame(dic1)

然后我有第二个数据帧df2:

dic2 = {'X':['c','e','b'],
'Y':[2,4,1],
'Z':[[188],[160,200],[784]]}
df2 = pd.DataFrame(dic2)

其中“X”列对应于“A”中找到的某些值; “Y”列对应于“X”中存在的“A”项的值的索引。

我的目标如下:

  • 第 1 步:仅选择“Z”列列表中包含 1 个元素的行
  • 第 2 步:根据“Y”中包含的索引替换“B”列中所选列表的值。

我能够通过以下代码行实现我的目标:

# Step 1
df2 = df2.loc[df2['Z'].str.len() == 1]

# Step 2
for idx,row in df2.iterrows():
df1.set_value(row['Y'],'B',row['Z'][0])

你能建议我一种更智能或更有效的方法来实现我的目标吗?也许使用 pandas 的某些功能?如果可能的话,我想避免使用 for 循环。

输出应如下所示:

# Before            # After
A B C A B C
0 a NaN x 0 a NaN x
1 b NaN y ---> 1 b 784.0 y
2 c NaN z ---> 2 c 188.0 z
3 d 150.0 v 3 d 150.0 v
4 e NaN w 4 e NaN w

最佳答案

您可以使用DataFrame.from_records从列 Z 中删除 lists:

df2 = df2[df2['Z'].str.len() == 1] 
df2.Z = pd.DataFrame.from_records(df2['Z'].values.tolist(), index=df2.index)
print (df2)
X Y Z
0 c 2 188
2 b 1 784

然后combine_firstfillnaNaN 替换为 df1 的值:

df1 = df1.set_index('A')
df1.B = df1['B'].combine_first(df2.set_index('X')['Z'])
#df1.B = df1['B'].fillna(df2.set_index('X')['Z'])
print (df1.reset_index())
A B C
0 a NaN x
1 b 784.0 y
2 c 188.0 z
3 d 150.0 v
4 e NaN w

关于python - 根据列表长度合并2个数据帧(使用Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41037000/

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