【问题标题】:Comparing entries in dataframes in pandas比较熊猫数据框中的条目
【发布时间】:2021-09-18 17:11:29
【问题描述】:

我有 2 个相同的数据帧,我们可以以此为例。

import pandas as pd
import numpy as np

data = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'],
                'episodes': [42, 24, 31, 29, 37, 40],
                'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
data1 = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'],
                'episodes': [12, 32, 31, 32, 37, 40],
                'gender': ['male', 'female', 'female', 'female', 'male', 'male']}    

df1 = pd.DataFrame(data1, columns = ['name','episodes', 'gender'])    
df = pd.DataFrame(data, columns = ['name','episodes', 'gender'])
for names in df['name']:
    if (df[df['name'].str.contains(f'{names}')]['episodes']).any() == (df1[df1['name'].str.contains(f'{names}')]['episodes']).any():
        print('True')
        
    else:
        print('False')

它正在检查两个数据帧之间的剧集数是否不同,并且应该在它们是不同剧集的地方打印false。但我得到了所有True

True
True
True
True
True
True

为什么不打印假?

【问题讨论】:

  • 当有重复的名字时,你的预期输出是什么,比如Sheldon?您是否希望它仅按索引进行比较?
  • 在你的例子中,df 和 df1 都得到了 dict data,没有得到 data1,你能纠正一下吗?
  • any() 方法返回一个布尔类型值,对于您的代码,== 运算符的两侧总是有一个True 值。所以,你总是在输出中得到true

标签: python python-3.x pandas compare


【解决方案1】:

使用set_index 然后比较episodes 列:

>>> df.set_index('name')['episodes'] == df1.set_index('name')['episodes']
name
Sheldon    False
Penny      False
Amy         True
Penny      False
Raj         True
Sheldon     True
Name: episodes, dtype: bool

【讨论】:

  • 由于name 列包含重复值,我认为这个答案与.eq() 方法的结果相同,对吧?例如,对于第一项和最后一项中的Sheldon,有三个值。我猜在将name 列设置为索引之后,它仍然会按照重复名称的顺序对其进行比较。
【解决方案2】:

你可以使用.eq()方法:

print(df.episodes.eq(df1.episodes))

0    False
1    False
2     True
3    False
4     True
5     True
Name: episodes, dtype: bool

【讨论】:

  • 它之所以起作用,只是因为 name 值在数据帧之间对齐。试试:df1.index += 10 然后df.episodes.eq(df1.episodes))
  • 你是对的。我在评论中询问了 OP,他们是否期望进行名称比较或仅进行整数索引比较。我没有得到任何答案,所以我发布了这个。
  • @ashkangh 我想要命名,但您的解决方案非常有帮助。谢谢
【解决方案3】:

我们可以试试merge

df.merge(df1,on='name',how='left').eval('episodes_x==episodes_y')

【讨论】:

    【解决方案4】:

    我认为您的意思是将 data1 放入 df1 中?现在,您已经单独从数据创建了 df1 和 df 。此外,您实际上并不需要逐行浏览它。 (df == df1)['episodes'] 应该给你你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多