在熊猫数据框中找到倒数行

Posted

技术标签:

【中文标题】在熊猫数据框中找到倒数行【英文标题】:find reciprocal rows in pandas Dataframe 【发布时间】:2019-04-17 10:35:10 【问题描述】:

我有这个数据框,并且只需要保留那些具有 2 列倒数值的行(此处为 numA 和 numB)。

gpm = pd.DataFrame(data=
    'id':[1,2,3,4,5,6,7,8,9],
    'time':[150315,150315,150315,150315,150315,150315,150315,150315,150315],
    'numA':['A','D','C','B','A','C','A','E','D'],
    'numB':['B','C','B','A','B','D','B','A','A'],
    'antA':['MSPDV','VIELU','RMPC1','MJCIH','PALT2','M2PV3','MACIF','MACIF','VIELU'],
    'antB':['BPDV8','0GRI3','SSFDJ','SSFDJ','SSFDJ','CCPG1','0GRI3','SSFDJ','SSFDJ']
    )

我只想要列 numA 和 numB 是倒数的行。也就是说,保留 (A,B)、(B,A) 和 (C,D),(D,C) 对出现的所有行。

目前,我的解决方案是列出所有唯一标识符,并逐行查看实际合作伙伴是否在合作伙伴列表中

它非常慢......(而且可能不正确!)

## here's my code
parties = 
nums = gpm['numA']+gpm['numB']
for i in nums.unique():
    parties[i] = gpm['numB'][gpm['numA'] == i]
    parties[i] = gpm['numA'][gpm['numB'] == i]

new_d = gpm.iloc[[0]]
for i in np.arange(1,gpm.shape[0]):
    numa = gpm.iloc[i]['numA']
    if gpm.iloc[i]['numB'] in parties[numa]:
        new_d.append(gpm.iloc[[i]])

任何精明的编码器可以帮助加快这个速度?实际要解析的文件是一个 ~15GB 的 csv。

谢谢

【问题讨论】:

【参考方案1】:

在您的示例中,我假设 (C, B)、(E, A) 和 (D, A) 的 id=3、8 和 9 的行是不需要的?如果是这样,这是一个标准的选择方法,通过比较 numAnumB 中的值以获得特定的可接受组合:

In [5]: gpm[((gpm['numA'] == 'A') & (gpm['numB'] == 'B')) |
   ...:     ((gpm['numA'] == 'B') & (gpm['numB'] == 'A')) |
   ...:     ((gpm['numA'] == 'C') & (gpm['numB'] == 'D')) | 
   ...:     ((gpm['numA'] == 'D') & (gpm['numB'] == 'C'))
   ...: ]
Out[5]:
   id    time numA numB   antA   antB
0   1  150315    A    B  MSPDV  BPDV8
1   2  150315    D    C  VIELU  0GRI3
3   4  150315    B    A  MJCIH  SSFDJ
4   5  150315    A    B  PALT2  SSFDJ
5   6  150315    C    D  M2PV3  CCPG1
6   7  150315    A    B  MACIF  0GRI3

(将结果分配给new_d

【讨论】:

以上是关于在熊猫数据框中找到倒数行的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中,当 ID 不唯一时,如何从每个 ID 的数据框中获取倒数第二行? [复制]

倒数第二个值(熊猫,Python)

如何在熊猫数据框中找到标准匹配上方和下方的x行,然后将它们保存为新的df?

如何查找在熊猫数据框中出现最多的行项目

如何识别和标记熊猫数据框中的相似行

数据表每一行的倒计时