Python 按元素比较或区分两列
我不熟悉熊猫(但不熟悉数据科学和Python)。这个问题不是关于如何解决这个具体问题,而是如何以熊猫的方式处理这样的问题 请随意改进这个问题的标题。因为我不确定这里的正确术语是什么 这是我的MWEPython 按元素比较或区分两列,python,pandas,Python,Pandas,我不熟悉熊猫(但不熟悉数据科学和Python)。这个问题不是关于如何解决这个具体问题,而是如何以熊猫的方式处理这样的问题 请随意改进这个问题的标题。因为我不确定这里的正确术语是什么 这是我的MWE #!/usr/bin/env python3 import pandas as pd data = {'A': [1, 2, 3, 3, 1, 4], 'B': ['One', 'Two', 'Three', 'Three', 'Eins', 'Four']} df = pd.D
#!/usr/bin/env python3
import pandas as pd
data = {'A': [1, 2, 3, 3, 1, 4],
'B': ['One', 'Two', 'Three', 'Three', 'Eins', 'Four']}
df = pd.DataFrame(data)
print(df)
导致
A B
0 1 One
1 2 Two
2 3 Three
3 3 Three
4 1 Eins
5 4 Four
我的假设是,当A
列中的值为1
时,B
列中的值始终为1
。等等
我想证明这个假设
第二,我还假设,如果我的第一个假设不正确,这不是一个错误,但有充分的(人为)原因。e、 g.参见行索引4
,其中A
-值与Eins
(而不是One
)相关,在B
列中
因此,我还需要看到和探索我的假设不正确的情况
问题更新:
这些数据只是一个例子。在现实世界中,我并没有意识到这两列是成对的。因为这样的解决方案在我的情况下不起作用
df.loc[df['A'] == 1, 'B']
我不知道A列中有多少个表达式和哪些表达式
我不知道如何使用pandas
。熊猫专业人士将如何解决这个问题
我的方法是将纯Python代码与
list()
、set()
和一些迭代一起使用 您可以通过以下方式过滤数据帧:
df.loc[df['A'] == 1, 'B']
这给出了B的值,其中A是1。接下来,您可以添加equals语句:
df.loc[df['A'] == 1, 'B'] == 'One'
这将产生一个布尔序列(在本例中为True,为False)。如果要检查是否全部为真,请添加:
all(df.loc[df['A'] == 1, 'B'] == 'One')
因为EIN,答案是错误的
编辑
如果要创建一个新列,说明是否满足条件(如果满足条件,则B的值始终相同),则可以执行以下操作:
df['C'] = df['A'].map(df.groupby('A')['B'].nunique() < 2)
df['C']=df['A'].map(df.groupby('A')['B'].nunique()<2)
这将导致一个布尔列。它通过将A中的值映射到括号中的列表来创建列C。在括号之间,它是a中值的groupby函数,并计算B中的唯一值。如果小于2,则它是唯一的。如果解决方案应测试每个
a
是否只有一个唯一值,并返回所有未在中使用计数唯一值的行,以重复每个组的聚合值,因此,可能的筛选行不是1
,这意味着每个A
有2个或多个唯一值:
df1 = df[df.groupby('A').B.transform('nunique').ne(1)]
print (df1)
A B
0 1 One
4 1 Eins
谢谢你的回答,这使我想到另一个我不知道的问题。我更新了我的问题。我不明白为什么我必须在
df['A']上使用map()
。
。map函数用于字典格式。在本例中,groupby将生成一个系列,其中a的所有唯一值都作为索引,a的值作为布尔值。因此,如果groupby生成True或False,则映射将在一个数组中查找每个元素。我建议将df.groupby('A')['B'].nunique()<2部分保存为变量,并将其打印或查看变量资源管理器。我认为就是这样。但我有点自大,试着去理解。但我没有如果你能用更多的原子步骤来解释这个解决方案。。。这太好了。
if df1.empty:
print ('My assumption is good')
else:
print ('My assumption is wrong')
print (df1)