首页 > 解决方案 > 更多pythonic方式来编辑列值 - python pandas

问题描述

我觉得必须有一种更 Pythonic 的方式(即:更简单、更直接)来更改我正在使用的数据框中的列值。基本上,我正在尝试match根据“ID”列的值来编辑列的值。

举个例子:

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'

标签: pythonpandasdataframe

解决方案


这个怎么样:

rounds = {
    111: 'Round 1',
    112: 'Round 2',
    113: 'Round 3',
    114: 'Round 4',
}

df['match'] = [rounds[i] for i in df.ID]


   Name  Age   ID    match
0   tom   10  111  Round 1
1  nick   15  112  Round 2
2  juli   14  113  Round 3
3  mary   17  114  Round 4

推荐阅读