我是编码的初学者,非常感谢您的帮助。我有一个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'])
答案 0 :(得分:1)
使用pandas
您将遇到4Gb数据帧的问题。我建议您查看dask
而不是复制pandas
api的部分内容,但不执行核心计算,即不会立即将所有内容加载到内存中。它应该是大多数操作的替代品。
如果我理解你的要求,这应该有效
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()
个频率