Python为groupby创建的行分配新行名

Python为groupby创建的行分配新行名,python,pandas,Python,Pandas,在我的数据集中,我使用groupby跨列求和值,并将新的求和值附加到原始数据框中,如下所示 import pandas as pd data = {'Person':['A','B','C','D','E','F'], 'NY':[1, 1, 0, 3, 0, 0], 'LA':[0, 1, 1, 0, 1, 1], 'CHI':[2, 0, 1, 0, 0, 1], 'Gender':['F','F','F','M','M','NA'], 'Citiz

在我的数据集中,我使用
groupby
跨列求和值,并将新的求和值附加到原始数据框中,如下所示

import pandas as pd
data = {'Person':['A','B','C','D','E','F'], 
    'NY':[1, 1, 0, 3, 0, 0],
    'LA':[0, 1, 1, 0, 1, 1],
    'CHI':[2, 0, 1, 0, 0, 1],
    'Gender':['F','F','F','M','M','NA'],
    'Citizenship':['US','Canada','US','US','Mexico','Canada'],
    'Age':['30s','30s','50s','NA','20s','30s']} 
df = pd.DataFrame(data) 
n_by_gender = df.groupby(['Gender']).sum()
n_by_citizenship = df.groupby(['Citizenship']).sum()
n_by_age = df.groupby(['Age']).sum()
df_new = pd.concat([df, n_by_gender, n_by_citizenship, n_by_age])
我注意到,当我连接这些数据帧时,Python会自动创建一个与我分配的组相关的索引,但这些并不是实际的行名称(如下图-来自Jupyter notebook)。有没有办法根据索引分配行名,而不是硬编码行名?(例如,第7、第8和第9行将命名为
“Gender\u F”、“Gender\u M”、“Gender\u NA”
,第10和第11行将命名为
“citizensity\u Canada”、“citizensity\u Mexico”
,…)是否更容易创建一个名为
ID
的新列或存储此信息的东西,而不是将其存储为行名

编辑:最终数据帧如下所示:

final = {'rownames':['NY','LA','CHI'],
         'Gender_F':[2,1,0],
         'Gender_M':[3,1,0],
         'Gender_NA':[0,1,1],
         'Citizenship_Canada':[1,2,1],
         'Citizenship_Mexico':[0,1,0],
         'Citizenship_US':[4,1,3],
         'Age_20s':[0,1,0],
         'Age_30s':[2,2,3],
         'Age_50s':[0,1,1],
         'Age_NA':[3,0,0]}
finaldf = pd.DataFrame(final)
finaldf

总之,使用
.melt
将数据帧解压为长格式,
pd.get\u dummies
创建虚拟变量列,
np.where
.groupby

  • 首先,
    .melt
    数据帧并指定所有未最终分组的列,因此将所有非“NY”、“LA”或“CHI”的列传递给
    id\u vars
    参数。“变量”列会自动创建,并带有相应的“值”列,将数据从宽格式(即透视格式)转换为长格式(即未透视格式)
  • 第二,使用
    pd.get_dummies()
    并传递要为其设置虚拟变量的列,并将
    dtype
    指定为“int”,为下一步做准备。或者,您可以为
    pd.get_dummies()
    使用默认的
    dtype
    ,它是
    np.uint8
    ,但我发现传递
    dtype='int'
    更容易
  • 在第三步中,我循环遍历相关列(除“value”列外的所有数据类型为“int”的列),并使用
    np.where()
    将“value”列应用于前面执行
    pd.get_dummies()
    时返回1的任何单元格
  • 最后,您已经准备好对“variable”列执行.groupby(),按三个城市(“NY”、“LA”、“CHI”)汇总数据


  • 原因是什么,你正在过滤并连接到同一个数据帧?最终我想扔掉包含单个信息的行(
    A
    B
    C
    ,…),然后转置数据帧,以便将
    NY
    LA
    CHI
    作为行,以及我计算的所有总和(
    F
    M
    NA
    ,…)列。好的,你能给我们一个预期输出的示例吗?谁知道呢,可能有一个简单的approach@wwnde刚刚添加了我希望生成的最终数据帧!
    import pandas as pd, numpy as np
    df1 = df.melt(id_vars=['Person', 'Gender', 'Citizenship', 'Age'])
    a = pd.get_dummies(df1, columns=['Gender', 'Citizenship', 'Age'], dtype='int')
    for col in a.columns.to_list():
        if col != ['value'] and a[col].dtype == 'int':
            a[col] = np.where(a[col] == 1, a['value'], a[col])
    b = a.groupby('variable').sum().reset_index().rename({'variable' : 'rownames'}, axis=1).drop('value', axis=1)
    b