【发布时间】:2020-10-19 03:25:08
【问题描述】:
我觉得必须有一种更 Pythonic 的方式(即:更简单、更直接)来更改我正在使用的数据框中的列值。基本上,我正在尝试根据“ID”列的值编辑列 match 的值。
举个例子:
data = [['tom', 10, 111], ['nick', 15, 112], ['juli', 14, 113], ['mary', 17, 114]]
# Create the pandas DataFrame
df = pd.DataFrame(data, columns = ['Name', 'Age', 'ID'])
我有一个简单的数据框,df
现在我将数据框分成几片
df2 = df.loc[df['ID'] == 111]
df3 = df.loc[df['ID'] == 112]
df4 = df.loc[df['ID'] == 113]
df5 = df.loc[df['ID'] == 114]
我想做的是在我的原始数据框中创建一个新列(称为“匹配”)。然后我想根据 ID 列将df2,df3,df4,df5 与它进行比较。在“匹配”列中,我将记录这些匹配发生的时间。让我逐步完成我的过程。
如果我这样做......
df['match_checker'] = df2['ID'].isin(df['ID'])
df.loc[df['match_checker'] == True, 'match'] = 'Round 1'
df['match_checker'] = df3['ID'].isin(df['ID'])
df.loc[df['match_checker'] == True, 'match'] = 'Round 2'
df['match_checker'] = df4['ID'].isin(df['ID'])
df.loc[df['match_checker'] == True, 'match'] = 'Round 3'
df['match_checker'] = df5['ID'].isin(df['ID'])
df.loc[df['match_checker'] == True, 'match'] = 'Round 4'
生成的数据框如下所示。这是期望的结果。 (match_checker 列会随着每次迭代而改变)。
Name Age ID match_checker match
0 tom 10 111 NaN Round 1
1 nick 15 112 NaN Round 2
2 juli 14 113 NaN Round 3
3 mary 17 114 True Round 4
我有想要的结果,但是创建数据帧的一个子集,然后将其与原始数据帧进行比较似乎是一种不好的方法。
注意 我不是在寻找以下解决方案:
df.loc[df['ID'] == 111), 'match'] = 'Round 1'
【问题讨论】: