我试图找到一种方法来将共享公共密钥的值(在下面的示例中,它将是ID)连接到数据框中的指定位置。
我从哪里开始:
df1 = pd.DataFrame({"ID" : ["x13", "x13", "", "x14", "" , "x13"], "Name":"Master1", "Slave1", "Master2", "Master3", "Master4" , "Slave2"],"value":["", "5", "7", "8", "", "1"]})
输出符合预期:
ID Name value
0 x13 Master1
1 x13 Slave1 5
2 Master2 7
3 x14 Master3 8
4 Master4
5 x13 Slave2 1
我想要达到的目标是:
ID Name value
0 x13 Master1 5,1
1 x13 Slave1 5
2 Master2 7
3 x14 Master3 8
4 Master4
5 x13 Slave2 1
用语言:我想遍历数据框并找到所有非空ID。当发现我想加入列表中具有公共ID的所有值,并将其存储在该特定ID的主服务器上的数据帧中。
我所有的解决方案尝试都以循环循环结束......
我确信该解决方案与pandas的groupby功能有关,但我无法获得所需的输出。
答案 0 :(得分:0)
一种方法是使用groupby
,然后通过掩码映射系列:
df = pd.DataFrame({"ID" : ["x13", "x13", "", "x14", "" , "x13"],
"Name": ["Master1", "Slave1", "Master2", "Master3", "Master4" , "Slave2"],
"value":["", "5", "7", "8", "", "1"]})
s = df[(df.ID != '') & (df.value != '')].groupby('ID')['value'].apply(list)
mask = df['ID'].isin(s.index) & df['Name'].str.startswith('Master')
df.loc[mask, 'value'] = df.loc[mask, 'ID'].map(s).apply(lambda x: ', '.join(x))
print(df)
# ID Name value
# 0 x13 Master1 5, 1
# 1 x13 Slave1 5
# 2 Master2 7
# 3 x14 Master3 8
# 4 Master4
# 5 x13 Slave2 1