python - 在数据框上使用自定义条件的 Pandas 数据透视表

标签 python pandas pivot-table

我想根据数据框中的自定义条件制作数据透视表:

数据框看起来像这样:

>>> df = pd.DataFrame({"Area": ["A", "A", "B", "A", "C", "A", "D", "A"],
                       "City" : ["X", "Y", "Z", "P", "Q", "R", "S", "X"],
                       "Condition" : ["Good", "Bad", "Good", "Good", "Good", "Bad", "Good", "Good"], 
                       "Population" : [100,150,50,200,170,390,80,100]
                       "Pincode" : ["X1", "Y1", "Z1", "P1", "Q1", "R1", "S1", "X2"] })
>>> df
  Area City Condition   Population Pincode
 0    A    X      Good   100       X1
 1    A    Y       Bad   150       Y1
 2    B    Z      Good   50        Z1
 3    A    P      Good   200       P1
 4    C    Q      Good   170       Q1
 5    A    R       Bad   390       R1
 6    D    S      Good   80        S1
 7    A    X      Good   100       X2

现在我想以某种方式旋转数据框 df,这样我就可以看到每个地区的城市的独特数量以及“好”城市的相应数量以及该地区的人口地区。

我期望这样的输出:

Area  city_count  good_city_count   Population
A        4        2                 940
B        1        1                 50
C        1        1                 170
D        1        1                 80
All      7        5                 1240

我可以为 aggfunc 参数提供一个字典,但这并没有给我在好城市之间划分的城市计数。

>>> city_count = df.pivot_table(index=["Area"],
                                values=["City", "Population"],
                                aggfunc={"City": lambda x: len(x.unique()),
                                         "Population": "sum"},
                                margins=True)

    Area    City    Population
0   A       4       940
1   B       1       50
2   C       1       170
3   D       1       80
4   All     7       1240

我可以合并两个不同的数据透视表 - 一个包含城市计数,另一个包含人口,但这对于具有大型 aggfunc 字典的大型数据集而言不可扩展。

最佳答案

使用fill_value 添加新参数columns,也可以使用nunique对于聚合函数:

city_count = df.pivot_table(index = "Area", 
                            values = "City", 
                            columns='Condition', 
                            aggfunc = lambda x : x.nunique(), 
                            margins = True,
                            fill_value=0)
print (city_count)
Condition  Bad  Good  All
Area                     
A            2     2    4
B            0     1    1
C            0     1    1
D            0     1    1
All          2     5    7

最后如果需要将索引转换为列并更改列名:

city_count = city_count.add_suffix('_count').reset_index().rename_axis(None, 1)
print (city_count)
  Area  Bad_count  Good_count  All_count
0    A          2           2          4
1    B          0           1          1
2    C          0           1          1
3    D          0           1          1
4  All          2           5          7

编辑:

d = {'City':'nunique','Population':'sum', 'good_city_count':'nunique'}
d1 = {'City':'city_count','Condition':'good_city_count'}

mask = df["Condition"] == 'Good'
df = (df.assign(good_city_count = lambda x: np.where(mask, x['City'], np.nan))
       .groupby('Area')
       .agg(d)
       .rename(columns=d1))

df = df.append(df.sum().rename('All')).reset_index()

print (df)
  Area  city_count  Population  good_city_count
0    A           4         940                2
1    B           1          50                1
2    C           1         170                1
3    D           1          80                1
4  All           7        1240                5

关于python - 在数据框上使用自定义条件的 Pandas 数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239514/

相关文章:

python - 使用 pandas 更快地计算行之间的相似度/距离

python - dask:延迟任务返回 None 或为空

google-sheets - 从 Google 表格数据透视表中删除零行

SQL Server Pivot 用于计算连接表中的实例

Python - 元组分配是否有 "don' t care"符号?

python - 最长重复子串

python - 为什么我的代码会死循环,大约是 'iter(c,a)'

python - 使用 Seaborn 条形图绘制 Pandas 分类系列

python - 将两个 csv 文件与自定义列合并

vba - 过滤掉数据透视表中的奇数