如何在pandas的列中选择最重复的字段?

时间:2017-06-08 08:51:06

标签: pandas

我是编码的初学者,非常感谢您的帮助。我有一个4gb的文件,我试图选择B列中最重复的字段(与A列不相似)和相应的列C

例如,

 Column A       Column B    Column C    id
 Sam             Sam          12        001
 Alex            David        10        001
 David           David        15        002
 Sarah           Alice        23        001 
 Alice           Sam          18        002
 Sam             Alice        20        002
 Anna            Sam          26        003

我想排除A列和B列中的名称是否相同,然后在B列中找到最重复的名称。而且我想找到B列中最重复字段的相应ID。

当我尝试使用以下命令时,出现内存错误。

(df.loc[~(df['Column B'].isin(df['Column A']) & df['Column B'].isin(df['Column C'])), 'Column B'])

1 个答案:

答案 0 :(得分:1)

使用pandas您将遇到4Gb数据帧的问题。我建议您查看dask而不是复制pandas api的部分内容,但不执行核心计算,即不会立即将所有内容加载到内存中。它应该是大多数操作的替代品。

https://dask.pydata.org

如果我理解你的要求,这应该有效

import pandas as pd
from dask import dataframe as dd

df = pd.DataFrame([['Sam', 'Alex', 'David', 'Sarah', 'Alice', 'Sam', 'Anna'],
                   ['Sam', 'David', 'David', 'Alice', 'Sam', 'Alice', 'Sam'],
                   [12, 10, 15, 23, 18, 20, 26]],
                  index=['Column A', 'Column B', 'Column C']).T
# have a look at dd.read_csv to avoid creating a pandas dataframe
# first, there's no need for that actually
dask_df = dd.from_pandas(df)

dask数据框现在看起来与pandas df

相同
In [39]: dask_df.head()
Out[39]: 
  Column A Column B Column C
0      Sam      Sam       12
1     Alex    David       10
2    David    David       15
3    Sarah    Alice       23
4    Alice      Sam       18

然后计算第二列中元素的频率

freq = (dask_df[dask_df['Column A'] != dask_df['Column B']]
        .groupby('Column B') # group by the values in the first column
        .value_counts() # the length of the group is the number of elements in it, i.e. the frequency
       )

freq.compute() # dask requires to call .compute()
Out[42]: 
Alice    2
David    1
Sam      2
dtype: int64

现在我们知道频率,您可以从dask数据框中选择所需的行

In [44]: dask_df[dask_df['Column B'] == 'Alice'][['Column B', 'Column C']].compute()
Out[44]: 
  Column B Column C
3    Alice       23
5    Alice       20

如果您只想使用k=5

来排查freq.nlargest(n=5).compute()个频率