数据划分处理(基于python的pandas中的dataframe数据结构)
我们常常需要从一个表格中,得到相关的子表格。
正如问题:按国家,从原始资源表中得到金银铜的年储量变化。(如图所示)
比较简单的做法可以是:多重循环
但小编往往不会满足于这样的处理方式,相反更偏向于使用相关的已有的函数,对整个表格同时进行处理。
分析上述实际问题,如果先按国家(魏、蜀、吴)划分为三个数据集,则储量可由(资源名、年份)唯一确定。
正如 df['金']['1960'] = 11,其中df为事先生成的空的dataframe。
data_Shu = data[data['国家'] == '蜀']
data_Wu = data[data['国家'] == '吴']
data_Wei = data[data['国家'] == '魏']
data_Shu的结果为:
资源名 国家 年份 储量
0 金 蜀 1960 11
1 金 蜀 1961 12
2 金 蜀 1962 13
3 银 蜀 1960 14
4 银 蜀 1961 15
5 银 蜀 1962 16
6 铜 蜀 1960 17
7 铜 蜀 1961 18
8 铜 蜀 1962 19
于是问题可看做是从这个dataframe中,以资源名列为columns,年份列为index,储量为数据,生成新的dataframe。
在此,小编向各位大佬发问:有没有现成函数,能实现这样的功能?
小编不知道,于是需要自己写这样的函数,调用情况如下:
df = create_df_by_2col(data_Shu, -1, 2, 0)
# 意思是由数据框data_Shu,以最后一列"储量"为要填充的数据,
# 以第二列"年份"为index,以第0列"资源名"为columns,生成新的数据框df
函数的具体定义如下:
def create_df_by_2col(dataframe, col_no_as_data, col_no_as_index, col_no_as_columns):
columns = dataframe.columns.tolist() # 结果为 ['资源名', '国家', '年份', '储量']
new_data_name = columns[col_no_as_data]
new_index_name = columns[col_no_as_index]
new_columns_name = columns[col_no_as_columns]
# index_from_col = dataframe[new_index_name]
# columns_from_col = dataframe[new_columns_name]
index_from_col = dataframe.iloc[:,col_no_as_index].unique()
columns_from_col = dataframe.iloc[:,col_no_as_columns].unique()
# 创建一个空的dataframe
df = pd.DataFrame(index = index_from_col, columns = columns_from_col)
for row in dataframe.itertuples():
# 如 df['金']['1960'] = 11
df[getattr(row, new_columns_name)][getattr(row, new_index_name)] = getattr(row, new_data_name)
return df
于是可通过如下代码得到结果
df_Shu = create_df_by_2col(data_Shu, -1, 2, 0)
df_Wu = create_df_by_2col(data_Wu, -1, 2, 0)
df_Wei = create_df_by_2col(data_Wei, -1, 2, 0)
其中 df_Shu 的结果为:
金 银 铜
1960 11 14 17
1961 12 15 18
1962 13 16 19
至此,该问题告一段落。
现在,思考在原数据框(不含铁)中,如果想以(金银铜铁)为columns,那该怎么办呢?
col_index = [1960,1961,1962]
col_columns = ['金','银','铜','铁']
df2_Shu = by_2col(data_Shu,-1,col_index,col_columns)
def by_2col(dataframe, col_data_index, col_index, col_columns):
# 创建一个空的dataframe
df = pd.DataFrame(index = col_index, columns = col_columns)
for index, row in dataframe.iterrows():
row = row.tolist()
df[row[0]][row[2]] = row[col_data_index] # 当然这些数字也可以变成函数的参数
return df
最后,小编还是真诚地发问,有没有现成函数,能实现这样的功能?从这个dataframe中,以资源名列为columns,年份列为index,储量为数据,生成新的dataframe。
希望有答案的、或是有更好方法的,请不吝评论,谢谢!
------
今天问了下ChatGPT,了解到有这个函数可以实现:
# 以资源名列为columns,年份列为index,储量为数据,生成新的dataframe
data_Shu.pivot(columns='资源名',values='储值',index='年份')