【发布时间】:2020-10-05 15:32:51
【问题描述】:
我有一个看起来像这样的 df(5m 行和大约 250 个不同的条约编号(都是字符串)):
Id Name Treaty Number
0 Id88 Jack x12
1 Id87 John x33
2 Id88 Jim x22
3 Id11 Hans x12
4 Id12 Ivan x33
5 Id88 Sara x22
6 Id11 Max x12
7 Id11 Peter x33
我想查找所有重复的 ID 以及属于该 ID 的每个条约编号的计数。
完美,它看起来像这样:
Sum
Id88 3 x12: 1, x22:2, ....
Id11 3 x12: 2, x33:1,...
现在我有以下代码:
import pandas as pd
import numpy as np
data = np.array([
['Id88', 'Jack', 'x12'],
['Id87', 'John', 'x33'],
['Id88', 'Jim', 'x22'],
['Id11', 'Hans', 'x12'],
['Id12', 'Ivan', 'x33'],
['Id88', 'Sara', 'x22'],
['Id11', 'Max', 'x12'],
['Id11', 'Peter', 'x33'],
])
columns=['Id', 'Name', 'Treaty Number']
df = pd.DataFrame(data= data, columns = columns)
dublicateIDs = df[df.duplicated(subset=['Id'],keep=False )]
pivotIDs = dublicateIDs.pivot_table(index=['Id'], aggfunc='size')
pivotIDs = pivotIDs.sort_values(ascending=False)
pivotTreaty = dublicateIDs.pivot_table(index=['Id'], columns = 'Treaty Number', aggfunc='size',
fill_value=0)
concatDF = [pivotIDs, pivotTreaty]
pivotIDsCombine = pd.concat(concatDF, axis=1, sort=False)
columnNames = pivotIDsCombine.columns.tolist()
columnNames[0] = 'Sum'
pivotIDsCombine.columns = columnNames
print(pivotIDsCombine)
结果如下:
Sum x12 x22 x33
Id88 3 1 2 0
Id11 3 2 0 1
由于大量的行 (5m) 和条约编号 (250) 以及每个 ID 的条约数量很少,我有一个巨大的表格,里面装满了 NaN(或零)。
有没有一种简单的方法使用数据透视表来达到所需的格式,或者我应该循环每列/行并手动计算出现次数?
【问题讨论】:
-
您可以接受字典,还是需要数据框作为输出?
-
字典也可以,我更喜欢 df,因为这样我可以轻松地将其保存为 csv
-
你可以很容易地拥有这样的数据透视表:
pd.pivot_table(df, index='Id', columns='Treaty Number', aggfunc='count')它需要更多的工作来处理重复列。你想让我工作吗?结果将与上述结果相似(每 x.. 数字一列) -
我可以轻松删除重复项并使用您为我编写的 pivot_table 语句。我的问题是如何只留下值不同于 0(NaN) 的条约编号,如下所示:Id11 3 x12: 2, x33:1,...
标签: python pandas numpy dataframe