pandas 按值获取具有重复列名的列表中的列表

wnvonmuf  于 2023-02-07  发布在  其他
关注(0)|答案(4)|浏览(250)

我有数据框:

import pandas as pd

data = [[101, 1, 2, 10, 3, 2, 3, 1], [5,5, 5, 5, 5, 5, 5, 5], [30, 3, 7, 14, 10, 7, 10, 2], [11, 2, 6, 15, 20, 6, 20, 11]] 

df = pd.DataFrame(data, columns = ['xen', 'sim', 'tab', 'sim', 'simm', 'box', 'simm', 'res'])

它看起来像:

|   xen |   sim |   tab |   sim |   simm |   box |   simm |   res |
|------:|------:|------:|------:|-------:|------:|-------:|------:|
|   101 |     1 |     2 |    10 |      3 |     2 |      3 |     1 |
|     5 |     5 |     5 |     5 |      5 |     5 |      5 |     5 |
|    30 |     3 |     7 |    14 |     10 |     7 |     10 |     2 |
|    11 |     2 |     6 |    15 |     20 |     6 |     20 |    11 |

我需要得到列表中的重复列的名称的值(它可以重复的名称或可能没有)。对于上面的数据框输出应该像:

[["tab", "box"], ["simm", "simm"]]
ffscu2ro

ffscu2ro1#

试试这个:

l=df.T.reset_index().groupby(df.index.tolist())['index'].agg(list).loc[lambda x : x.str.len()>=2].values.tolist()
[['tab', 'box'], ['simm', 'simm']]
v64noz0r

v64noz0r2#

看起来你需要比较每对列。所以broadcast是一个想法:

# extract the numpy array
values = df.to_numpy()

# compare columns by columns
rows, cols = np.where(np.triu((values[:,:,None] == values[:,None, :]).all(0), 1))

# output:
[df.columns[[r,c]].values for r,c in zip(rows,cols)]

输出:

[array(['tab', 'box'], dtype=object), array(['simm', 'simm'], dtype=object)]
vqlkdk9b

vqlkdk9b3#

res = df.T.loc[df.T.duplicated(keep=False)]
pairs = res.sort_values(res.columns.tolist()).index
[ent.tolist() for ent in np.split(pairs,2)]
[['tab', 'box'], ['simm', 'simm']]
pdtvr36n

pdtvr36n4#

下面是一个方法:

s = df.apply(tuple,result_type='reduce')

s.reset_index().loc[s.duplicated(keep=False).tolist()].groupby(0)['index'].agg(list).tolist()

输出:

[['tab', 'box'], ['simm', 'simm']]

相关问题