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'
更容易np.where()
将“value”列应用于前面执行pd.get_dummies()
时返回1的任何单元格原因是什么,你正在过滤并连接到同一个数据帧?最终我想扔掉包含单个信息的行(
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