如何旋转特定的数据框?
How to pivot a specific dataframe?
我有一个包含混合数据(浮点数和文本)的数据框 df
,打印时看起来像这样(它只是打印的一小部分):
0 1
0 Le Maurepas NaN
1 CODE_90 AREA_HA
2 112 194.97
3 121 70.37
4 211 113.86
5 La Rolande NaN
6 CODE_90 AREA_HA
7 112 176.52
8 211 97.28
如有必要,可以通过以下代码(例如)重现此输出:
import pandas as pd
fst_col = ['Le Maurepas', 'CODE_90', 112, 121, 211, 'La Rolande', 'CODE_90', 112, 211]
snd_col = ['NaN', 'AREA_HA', 194.97, 70.37, 113.86, 'NaN', 'AREA_HA', 176.52, 97.28]
df = pd.DataFrame({'0' : fst_col, '1' : snd_col})
df
我想为我的数据框提供另一个结构 df
并使其在打印时看起来像这样:
Name Code Area
0 Le Maurepas 112 194.97
1 Le Maurepas 121 70.37
2 Le Maurepas 211 113.86
3 La Rolande 112 176.52
4 La Rolande 211 97.28
我浏览了 SO
,我知道像 pivot(index='', columns='', values='')
这样的函数也许可以完成这项工作,但我不知道它是否适用于我的情况,事实上,不知道怎么申请...
我是否还必须通过操纵参数index
、columns
、values
来坚持这个功能,还是有特定的方法,更精确地对应于结构我的初始数据框 df
?
欢迎任何帮助。
IIUC,尝试:
#change the string "NaN" empty values
df["1"] = df["1"].replace("NaN", None)
output = pd.DataFrame()
output["Name"] = df.loc[df["1"].isnull(), "0"].reindex(df.index, method="ffill")
output["Code"] = pd.to_numeric(df["0"], errors="coerce")
output["Area"] = pd.to_numeric(df["1"], errors="coerce")
output = output.dropna().reset_index(drop=True)
>>> output
Name Code Area
0 Le Maurepas 112.0 194.97
1 Le Maurepas 121.0 70.37
2 Le Maurepas 211.0 113.86
3 La Rolande 112.0 176.52
4 La Rolande 211.0 96.28
您可以使用:
indexes = (df[df['0'].eq('CODE_90')].index - 1).to_list()
indexes.append(len(df))
all_dfs = []
for idx in range(0, len(indexes)-1):
df_temp = df.loc[indexes[idx]:indexes[idx+1]-1]
print(df_temp)
df_temp['Name'] = df_temp['0'].iloc[0]
df_temp.rename(columns={'0': 'Code', '1': 'Area'}, inplace=True)
all_dfs.append(df_temp.iloc[2:])
df = pd.concat(all_dfs, ignore_index=True)
print(df)
我有一个包含混合数据(浮点数和文本)的数据框 df
,打印时看起来像这样(它只是打印的一小部分):
0 1
0 Le Maurepas NaN
1 CODE_90 AREA_HA
2 112 194.97
3 121 70.37
4 211 113.86
5 La Rolande NaN
6 CODE_90 AREA_HA
7 112 176.52
8 211 97.28
如有必要,可以通过以下代码(例如)重现此输出:
import pandas as pd
fst_col = ['Le Maurepas', 'CODE_90', 112, 121, 211, 'La Rolande', 'CODE_90', 112, 211]
snd_col = ['NaN', 'AREA_HA', 194.97, 70.37, 113.86, 'NaN', 'AREA_HA', 176.52, 97.28]
df = pd.DataFrame({'0' : fst_col, '1' : snd_col})
df
我想为我的数据框提供另一个结构 df
并使其在打印时看起来像这样:
Name Code Area
0 Le Maurepas 112 194.97
1 Le Maurepas 121 70.37
2 Le Maurepas 211 113.86
3 La Rolande 112 176.52
4 La Rolande 211 97.28
我浏览了 SO
,我知道像 pivot(index='', columns='', values='')
这样的函数也许可以完成这项工作,但我不知道它是否适用于我的情况,事实上,不知道怎么申请...
我是否还必须通过操纵参数index
、columns
、values
来坚持这个功能,还是有特定的方法,更精确地对应于结构我的初始数据框 df
?
欢迎任何帮助。
IIUC,尝试:
#change the string "NaN" empty values
df["1"] = df["1"].replace("NaN", None)
output = pd.DataFrame()
output["Name"] = df.loc[df["1"].isnull(), "0"].reindex(df.index, method="ffill")
output["Code"] = pd.to_numeric(df["0"], errors="coerce")
output["Area"] = pd.to_numeric(df["1"], errors="coerce")
output = output.dropna().reset_index(drop=True)
>>> output
Name Code Area
0 Le Maurepas 112.0 194.97
1 Le Maurepas 121.0 70.37
2 Le Maurepas 211.0 113.86
3 La Rolande 112.0 176.52
4 La Rolande 211.0 96.28
您可以使用:
indexes = (df[df['0'].eq('CODE_90')].index - 1).to_list()
indexes.append(len(df))
all_dfs = []
for idx in range(0, len(indexes)-1):
df_temp = df.loc[indexes[idx]:indexes[idx+1]-1]
print(df_temp)
df_temp['Name'] = df_temp['0'].iloc[0]
df_temp.rename(columns={'0': 'Code', '1': 'Area'}, inplace=True)
all_dfs.append(df_temp.iloc[2:])
df = pd.concat(all_dfs, ignore_index=True)
print(df)