0

我有一大组数据,其中包含 100 多列数据,其结构如下:

country_a country_b 年份 variable1 variable2 ...... variable100

目标是将 100 个变量分成 100 个新的数据帧,进行旋转,然后将它们保存到 csvs 中。

下面是转换一个变量的代码:

import pandas as pd

df = pd.DataFrame({
    'country_a': ['aa', 'bb', 'cc'],
    'country_b': ['xx', 'yy', 'zz'],
    'year': [2018, 2019, 2020],
    'var_a': [1, 0, 1],
    'var_b': [2, 1, 2],
    'var_c': [0, 1.6, 2.4]
})

print(df)

  country_a country_b  year  var_a  var_b  var_c
0        aa        xx  2018      1      2    0.0
1        bb        yy  2019      0      1    1.6
2        cc        zz  2020      1      2    2.4

然后我会做一个支点:

table=pd.pivot_table(df, values='var_a', index=['country_a','country_b'],columns=['year']).reset_index()
table.to_csv('var_a.csv')

表将如下所示:

    country_a   country_b   2018    2019    2020
0   aa  xx  1.0 NaN NaN
1   bb  yy  NaN 0.0 NaN
2   cc  zz  NaN NaN 1.0

我在这里问了问题的第一部分:熊猫:将 100 多个变量融合到 100 多个新数据帧中 现在我在为分离的 dfs 合并枢轴函数时遇到了问题......

十分感谢!

4

3 回答 3

0

这是一种重新塑造原始数据帧的方法(使用melt、unstack和reset_index),然后将var_a、var_b、...中的每一个导出到自己的CSV文件中:

df_new = (
    df.melt(id_vars=['country_a', 'country_b', 'year'], 
            var_name='variable', 
            value_name='value')
    .set_index(['country_a', 'country_b', 'year', 'variable'])
    .sort_index()
    .squeeze()
    .unstack(level='year')
    .fillna(0)              # for display purposes
    .astype(int)            # also for display purposes
    .reset_index(level=['country_a', 'country_b'])
)
print(df_new)

year     country_a country_b  2018  2019  2020
variable                                      
var_a           aa        xx     1     0     0
var_b           aa        xx     2     0     0
var_c           aa        xx     0     0     0
var_a           bb        yy     0     0     0
var_b           bb        yy     0     1     0
var_c           bb        yy     0     1     0
var_a           cc        zz     0     0     1
var_b           cc        zz     0     0     2
var_c           cc        zz     0     0     2

现在将每个变量导出到其自己的 CSV 文件:

for idx in df_new.index.unique():
    filename = f'{idx}.csv'
    with open(filename, 'wt') as handle:
        #df_new.loc[idx].to_csv(handle)      # <- un-comment this line in your code
        print(filename)
        print(df_new.loc[idx])
        print()

var_a.csv
year     country_a country_b  2018  2019  2020
variable                                      
var_a           aa        xx     1     0     0
var_a           bb        yy     0     0     0
var_a           cc        zz     0     0     1

var_b.csv
year     country_a country_b  2018  2019  2020
variable                                      
var_b           aa        xx     2     0     0
var_b           bb        yy     0     1     0
var_b           cc        zz     0     0     2

var_c.csv
year     country_a country_b  2018  2019  2020
variable                                      
var_c           aa        xx     0     0     0
var_c           bb        yy     0     1     0
var_c           cc        zz     0     0     2
于 2020-08-26T16:54:00.200 回答
0

代替 Pivot ,使用 pd.melt ,它对您的情况有效

于 2020-08-26T16:08:14.300 回答
0

我们可以使用DataFrame.pivot_table,然后我们可以join使用国家列DataFrame.filter

new_df = (df.filter(regex='country')
            .join(df.pivot_table(index=df.index, columns='year', values='var_a'))
         )
print(new_df)

输出

  country_a country_b  2018  2019  2020
0        aa        xx   1.0   NaN   NaN
1        bb        yy   NaN   0.0   NaN
2        cc        zz   NaN   NaN   1.0

如果您无法使用以下方式过滤国家/地区,DataFrame.filter则可以使用以下方式选择列:

list_columns_names = ['spain', 'england',..]
df[list_columns_names].join(df.pivot_table(...))

如果国家/地区的列一起在数据框中,则可能更易于使用iloc

num_countries = 10
df.iloc[:,:num_countries].join(df.pivot_table(...))

另一个选项是set_index+ unstack

new_df = (df.filter(regex='country')
            .join(df.set_index('year', append=True)['var_a'].unstack('year'))
         )
于 2020-08-26T16:12:27.017 回答