如何在列中按值分组,找到null,然后

2024-04-20 13:37:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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”列中找到表示“yes”的单元格,并在“loser”列/行中用相应的“name”替换它们,表示“yes”

到目前为止,我所做的是使用groupby对数据帧进行排序:

    d = pd.read_excel('nameoffile.xls', sheet_name='jw')
    df = pd.DataFrame(d)
    df1 = dict(tuple(df.groupby('sortvalue')))

这给了我一系列按“sortvalue”排序的字典。但是我不知道如何编写函数来迭代这些字典,将win中的“yes”替换为“loser”中“yes”列中的“name”。我也不确定groupby是否是正确的做法。编字典对吗?你知道吗


Tags: 数据name字典排序fredwinjanyes
3条回答

可能是一个更简单的版本,使用类似于第一个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']]

在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)

yes值、rename列筛选数据帧并使用^{}

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

相关问题 更多 >