Pandas:如何仅选择列

时间:2018-01-16 12:58:43

标签: python pandas pandas-groupby

我有一个包含['join key', 'code', 'A', 'B', 'C', 'D']列的数据框。

join key是一长串字符,而code可以等于521,539或其他一些数字。

可以有相同join key的行。

我希望能够按join key我的记录进行分组,并且只有code字段设置为521和539时出现在我的数据框中的所有重复记录。

我不希望那些可能具有相同密钥且code=521但没有code=539对应的记录。

一旦我拥有所有重复对,我想应用一个函数compute(x),它将该对合并为一行,由['A', 'B']行和code=521列组成['C', 'D']行中的code=539列。

我似乎无法选择正确的行。我一直在join key选择那些重复的行,但它们都是相同的代码而不是对应的。

import pandas as pd
exp_csv = pd.DataFrame([[3566190983, 521, 1, 2, 3, 4], \
                        [3566190983, 539, 1, 2, 3, 4], \
                        [3509730366, 521, 1, 2, 3, 4], \
                        [3509730366, 521, 1, 2, 3, 4], \
                        [3509730366, 521, 1, 2, 3, 4], \
                        [9809730686, 500, 1, 2, 3, 4]],\
                        columns=['join key', 'code', 'A', 'B', 'C', 'D'])

interim = exp_csv[exp_csv.duplicated(['join key'], keep=False)]
interim = interim.loc[(interim['code'] == 521) | (interim['code'] == 539)]
interim = interim.groupby(by='join key').apply(lambda x: compute(x))

1 个答案:

答案 0 :(得分:1)

我认为您需要比较set并按boolean indexing过滤:

mask = exp_csv.groupby('join key')['code'].transform(lambda x: set(x) == set([521, 539]))
interim = exp_csv[mask]
print (interim)
     join key  code  A  B  C  D
0  3566190983   521  1  2  3  4
1  3566190983   539  1  2  3  4