如何按列中的值分组,找到null,然后替换

时间:2019-08-13 05:17:46

标签: python pandas

我是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是否正确。制作字典对吗?

3 个答案:

答案 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']]