我是Python的新手,我迷路了。
我有一个名为d的数据框,如下所示:
name win loser sortvalue
joe yes car1
jan yes car1
stan yes car1
fred yes car2
josh yes car2
我希望它看起来像这样:
win loser sortvalue
joe jan car1
joe stan car1
josh fred car2
因此,我想按“ sortvalue”对它进行排序,然后在“ win”列中找到“是”的单元格,并在“失败者”列/行中将相应的“ name”替换为“是” 。”
到目前为止,我所做的是使用groupby对数据框进行排序:
d = pd.read_excel('nameoffile.xls', sheet_name='jw')
df = pd.DataFrame(d)
df1 = dict(tuple(df.groupby('sortvalue')))
这给了我一系列按“ sortvalue”排序的字典。但是我无法弄清楚如何编写遍历这些字典的函数,以用“失败者”中表示“是”的列中的“名称”替换胜利中的“是”。而且我也不确定groupby是否正确。制作字典对吗?
答案 0 :(得分:3)
按yes
个值,rename
列过滤DataFrame并使用DataFrame.merge
:
df1 = df.loc[df['win'] == 'yes', ['name','sortvalue']].rename(columns={'name':'win'})
df2 = df.loc[df['loser'] == 'yes', ['name','sortvalue']].rename(columns={'name':'loser'})
df = pd.merge(df1, df2, on='sortvalue')[['win','loser','sortvalue']]
print (df)
win loser sortvalue
0 joe jan car1
1 joe stan car1
2 josh fred car2
答案 1 :(得分:0)
在对sortvalue分组时构建一个新的数据框:
results = []
for car, row in df.groupby('sortvalue'):
winner = row[row['win'] == 'yes'].iloc[0]
for _, item in row[row['loser'] == 'yes'].iterrows():
loser = item
results.append({
'win': winner['name'],
'loser': loser['name'],
'sortvalue': car
})
df = pd.DataFrame(results)
答案 2 :(得分:0)
也许是使用类似于第一次ans的逻辑的更简单版本。
d = [['joe','yes',np.nan,'cart1'],['jan',np.nan,'yes','cart1'],['stan',np.nan,'yes','cart1'],['fred',np.nan,'yes','cart2'],['stan','yes',np.nan,'cart2']]
d = pd.DataFrame(data=d,columns=['name','win','lose','value'])
d1 = d[d['win']=='yes'].loc[:,['name','value']]
d2 = d[d['lose']=='yes'].loc[:,['name','value']]
d1['winner']=d1['name']
d2['loser']=d2['name']
ans = pd.merge(d1,d2,on='value').loc[:,['winner','loser','value']]