pandas 如何检查一个行值存在于任何其他列的行值中

x8diyxa7  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(162)

我有如下的优点

A B
1A 100 
2A  1A 
3A  101
5A  1A

预期输出为

A B   Bool
1A 100  
2A  1A  True
3A  101 
5A  1A   True

这里你可以看到df ['A ']中的1A也出现在df ['B]中
我试着

import pandas as pd
df = pdf.read_excel('test.xlsx')
df['A'].isin(df['B'])

但它不工作

gt0wga4j

gt0wga4j1#

import pandas as pd
import numpy as np

data = {
    'A':['1A','2A','3A','5A'],
    'B':[100,'1A',101,'1A'],
    'Bool': False
}
df = pd.DataFrame(data)

使用此代码,您将获得以下 Dataframe :

A    B   Bool
0  1A  100  False
1  2A   1A  False
2  3A  101  False
3  5A   1A  False

您可以使用iterrows()以这种方式更正第三列

list_A = np.array(df['A'])
for index, row in df.iterrows():
  if df['B'][index] in list_A:
    df['Bool'][index] = True

输出为:

A    B   Bool
0  1A  100  False
1  2A   1A   True
2  3A  101  False
3  5A   1A   True

但这并不是一个好的解决方案,如果没有iterrows(),你可以做如下操作:

data = {
    'A':['1A','2A','3A','5A'],
    'B':[100,'1A',101,'1A']
}
df = pd.DataFrame(data)

df['bool'] = df['B'].isin(df['A'])

输出是相同的:

A    B   bool
0  1A  100  False
1  2A   1A   True
2  3A  101  False
3  5A   1A   True
    • 为什么第二种方法比使用iterrows()更好?**
  • 设置复制警告:通常,当你对Pandas中的行运行iterrows(),同时改变 Dataframe 中的一个值时,你会得到以下警告:
SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a DataFrame
  • 运行时间:
df['B'].isin(df['A']) Time:  0.002069372000050862
df.iterrows()         Time:  0.010589972999696329

相关问题