从宽到长的多行且只有两个变量
Wide to long multiple rows and only two variables
我一直在搜索,但没有找到答案。我有下一个数据框
Pais Anio Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad
0 NaN NaN No No No No No Si Si Si Si Si Total
1 NaN NaN Rural Rural Urbana Urbana Total No Rural Rural Urbana Urbana Total Si Total Si
2 NaN NaN Hombre Mujer Hombre Mujer NaN Hombre Mujer Hombre Mujer NaN NaN
3 Argentina 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Bolivia 2014 513160 462745 24457 25959 1026321 1187340 1243921 3554853 3686894 9673008 10699329
5 Brasil 2015 287373 216447 28718 15895 548433 15898153 14545231 81355185 88432517 200231086 200779519
6 Chile 2011 20192 16702 8752 7090 52736 1054604 1053353 6936960 7749581 16794498 16847234
这是期望的输出:
我将所需的输出放在图像中,因为它有很多数据,我设法只得到一个融化,但我还需要 "melt" Yes/No、区域和性别行...
我的代码是这样的:
df1 = df.iloc[0:3] # select three first rows
df1 = df1.ffill(axis='columns') #Rellenando los grupos
df = df.iloc[3:]
# my_dataframe = my_dataframe[my_dataframe.employee_name != 'chad']
df1 = df1.append(df)
# moviendo primera fila a titulo de columna
df1.columns = df1.iloc[0]
df1 = df1.reindex(df1.index.drop(0)).reset_index(drop=True)
df1.columns.name = None
df1 = pd.melt(df1, id_vars=["Pais", "Anio"], var_name="Pregunta")
对此的建议和建议表示赞赏!!!
您的解决方案可能使用:
df.iloc[:3] = df.iloc[:3].ffill(axis='columns') #Rellenando los grupos
#MultiIndex by columns and first 3 rows
df.columns = [df.columns,
df.iloc[0],
df.iloc[1],
df.iloc[2]]
df = (df.iloc[3:] #remove first 3 rows
.set_index(df.columns.tolist()[:2]) #first 2 cols to MultiIndex
.rename_axis(['Pais','Anio']) #removed tuples names
.unstack([0,1]) #reshape
.rename_axis(['Pregunta','Respuesta','Zona','Sexo','Pais','Anio']) #levels names
.sort_index(level=['Pais','Anio']) #sorting levels
.reset_index(name='Total') #Series to DataFrame
.dropna(subset=['Anio']) #removed NaNs if in Anio column
.assign(Anio = lambda x: x['Anio'].astype(int)) #Convert Anio to int
.reindex(['Pais','Anio','Pregunta','Zona','Sexo','Respuesta','Total'],1) #order
.dropna(subset=['Total']) #removed NaNs by Total column
.assign(Total = lambda x: x['Total'].astype(int)) #convert Total to ints
)
print (df.head(10))
Pais Anio Pregunta Zona Sexo Respuesta Total
44 Bolivia 2014 Electricidad Rural Hombre No 513160
45 Bolivia 2014 Electricidad Rural Mujer No 462745
46 Bolivia 2014 Electricidad Total No Mujer No 1026321
47 Bolivia 2014 Electricidad Urbana Hombre No 24457
48 Bolivia 2014 Electricidad Urbana Mujer No 25959
49 Bolivia 2014 Electricidad Rural Hombre Si 1187340
50 Bolivia 2014 Electricidad Rural Mujer Si 1243921
51 Bolivia 2014 Electricidad Total Si Mujer Si 9673008
52 Bolivia 2014 Electricidad Urbana Hombre Si 3554853
53 Bolivia 2014 Electricidad Urbana Mujer Si 3686894
我一直在搜索,但没有找到答案。我有下一个数据框
Pais Anio Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad Electricidad
0 NaN NaN No No No No No Si Si Si Si Si Total
1 NaN NaN Rural Rural Urbana Urbana Total No Rural Rural Urbana Urbana Total Si Total Si
2 NaN NaN Hombre Mujer Hombre Mujer NaN Hombre Mujer Hombre Mujer NaN NaN
3 Argentina 2015 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Bolivia 2014 513160 462745 24457 25959 1026321 1187340 1243921 3554853 3686894 9673008 10699329
5 Brasil 2015 287373 216447 28718 15895 548433 15898153 14545231 81355185 88432517 200231086 200779519
6 Chile 2011 20192 16702 8752 7090 52736 1054604 1053353 6936960 7749581 16794498 16847234
这是期望的输出:
我将所需的输出放在图像中,因为它有很多数据,我设法只得到一个融化,但我还需要 "melt" Yes/No、区域和性别行...
我的代码是这样的:
df1 = df.iloc[0:3] # select three first rows
df1 = df1.ffill(axis='columns') #Rellenando los grupos
df = df.iloc[3:]
# my_dataframe = my_dataframe[my_dataframe.employee_name != 'chad']
df1 = df1.append(df)
# moviendo primera fila a titulo de columna
df1.columns = df1.iloc[0]
df1 = df1.reindex(df1.index.drop(0)).reset_index(drop=True)
df1.columns.name = None
df1 = pd.melt(df1, id_vars=["Pais", "Anio"], var_name="Pregunta")
对此的建议和建议表示赞赏!!!
您的解决方案可能使用:
df.iloc[:3] = df.iloc[:3].ffill(axis='columns') #Rellenando los grupos
#MultiIndex by columns and first 3 rows
df.columns = [df.columns,
df.iloc[0],
df.iloc[1],
df.iloc[2]]
df = (df.iloc[3:] #remove first 3 rows
.set_index(df.columns.tolist()[:2]) #first 2 cols to MultiIndex
.rename_axis(['Pais','Anio']) #removed tuples names
.unstack([0,1]) #reshape
.rename_axis(['Pregunta','Respuesta','Zona','Sexo','Pais','Anio']) #levels names
.sort_index(level=['Pais','Anio']) #sorting levels
.reset_index(name='Total') #Series to DataFrame
.dropna(subset=['Anio']) #removed NaNs if in Anio column
.assign(Anio = lambda x: x['Anio'].astype(int)) #Convert Anio to int
.reindex(['Pais','Anio','Pregunta','Zona','Sexo','Respuesta','Total'],1) #order
.dropna(subset=['Total']) #removed NaNs by Total column
.assign(Total = lambda x: x['Total'].astype(int)) #convert Total to ints
)
print (df.head(10))
Pais Anio Pregunta Zona Sexo Respuesta Total
44 Bolivia 2014 Electricidad Rural Hombre No 513160
45 Bolivia 2014 Electricidad Rural Mujer No 462745
46 Bolivia 2014 Electricidad Total No Mujer No 1026321
47 Bolivia 2014 Electricidad Urbana Hombre No 24457
48 Bolivia 2014 Electricidad Urbana Mujer No 25959
49 Bolivia 2014 Electricidad Rural Hombre Si 1187340
50 Bolivia 2014 Electricidad Rural Mujer Si 1243921
51 Bolivia 2014 Electricidad Total Si Mujer Si 9673008
52 Bolivia 2014 Electricidad Urbana Hombre Si 3554853
53 Bolivia 2014 Electricidad Urbana Mujer Si 3686894