将值放在数据框列中

时间:2020-10-23 12:13:22

标签: python pandas dataframe

好的,我用一个新示例编辑了这个问题。

我无法在数据框中填充新列imshow(z, aspect=gx.ptp() / gy.ptp()) show() # needed if you try this in PyCharm

#我使用了其中一个答案的示例:

df['Colour']

使用此代码,我想创建一个名为'Colour'的新列,并用d = {"symbol":["Heart", "Heart", "Diamond", "Spade"], "symbol2":["Heart","Diamond", "Spade", "Spade"]}` df_s = pd.DataFrame(d) df_s['color'] = df_s['symbol'].map(lambda x: 'Correct' if x == df_s['symbol2'] else 'Wrong') 'Correct'的值填充空白。

但是我只得到错误:

'Wrong'

我做错了什么?

编辑:错误保持不变。

3 个答案:

答案 0 :(得分:0)

假设您的数据框具有以下结构:

d = {"symbol":["Heart", "Heart", "Diamond", "Spade"]}
df = pd.DataFrame(d)
print(df)

    symbol
0    Heart
1    Heart
2  Diamond
3    Spade

您可以在“符号”列上使用.map以获得所需的结果:

df['color'] = df['symbol'].map(lambda x: 'red' if x == 'Heart' else 'not red')
print(df)

    symbol    color
0    Heart      red
1    Heart      red
2  Diamond  not red
3    Spade  not red

编辑

基于OP的新修改,以防万一需要考虑多列的情况,最好按行使用.apply

df_s['color'] = df_s.apply(lambda r: 'red' if r[0]=='Heart' and r[1]=='Heart' else 'not red', axis=1)

要检查两列是否相同(可以使用相同的逻辑):

df_s.apply(lambda r: 'correct' if r[0]==r[1] else 'wrong', axis=1)

如果您要检查所有列或更多,然后2:

df_s.apply(lambda r: 'correct' if len(set(r)) == 1 else 'wrong', axis=1)

如果一行中的所有列都相同,则该行的set()的长度为1。

答案 1 :(得分:0)

问题是您想查看每一行中的值,并且如果该行中的值等于"Heart",则想对其进行处理。但是,您正在做的是看整个系列,而python不知道该怎么做(何时正确,应该这样做?如果所有元素都正确(a.all())或至少一个(a.any()或...)。

要实现您的要求,可以执行以下操作:

df.loc[df['symbole'] == 'Heart', 'Colour'] = 'red'
df.loc[df['symbole'] != 'Heart', 'Colour'] = 'not red'

有关更多方法,请参见以下答案:

Using conditional to generate new column in pandas dataframe

Pandas conditional creation of a series/dataframe column

答案 2 :(得分:0)

您还可以使用熊猫套用:

df['color'] = df.apply(lambda row: (   
                                      'red'
                                       if row['symbole'] == 'Heart'
                                       else 'not red',
                                       axis=1
                                   )