我有一个DataFrame,其中多个列包含相同的数据,但存储方式不同。
例如,一列充满了航空公司名称(美国航空等为AA),另一列充满了航空公司ID。
我如何快速检查这两列是否实际上填充了相同的信息(每个运营商确实只有一个ID?)的目标是安全地删除两列之一?
到目前为止,我有以下内容:
#for each carrier
for carrier in data.CARRIER.unique():
#print all the different AIRLINE_ID that appear when we subset the data for this carrier
print(carrier, data[ data['CARRIER'] == carrier].AIRLINE_ID.unique())
这使我返回了每个运营商的每个唯一ID的列表,并且由于每个CARRIER仅具有一个ID值,所以我可以放心地删除其中一列。
我只是想知道是否有一个熊猫函数可以做到这一点而无需循环和检查。 (因为我读过某个地方,所以每当您开始编写用于操纵DF的代码时,某个函数都可能存在于^^处)
感谢您的时间
答案 0 :(得分:2)
使用groupby
,nunique
和all
:
(df.groupby('ID')['CARRIER'].nunique().eq(1)).all()
如果每个True
仅一个CARRIER
,则返回ID
,否则返回False
。
例如:
如果每个CARRIER
有一个ID
>>> df
ID CARRIER
0 1 AA
1 2 BB
2 3 CC
3 1 AA
4 2 BB
>>> (df.groupby('ID')['CARRIER'].nunique().eq(1)).all()
True
但是另一方面,当每个ID
有多个不同的名称时(这里ID
2具有2个不同的CARRIER
):
>>> df
ID CARRIER
0 1 AA
1 2 BB
2 3 CC
3 1 AA
4 2 DD
>>> (df.groupby('ID')['CARRIER'].nunique().eq(1)).all()
False
您还可以使用以下方法查看哪个ID
具有多个CARRIER
值:
>>> df.groupby('ID')['CARRIER'].nunique()
ID
1 1
2 2
3 1
Name: Name, dtype: int64
这向您显示ID
2具有2个唯一的CARRIER
值