【问题标题】:Reshaping a pandas dataframe based on column values根据列值重塑熊猫数据框
【发布时间】:2020-12-27 22:36:42
【问题描述】:

我想根据特定列中的值重塑 pandas 数据框,以便为起始数据框中的每个值列对获得一个新列。我想从中得到:

import pandas as pd

d = {'city': ['Berlin', 'Berlin', 'Berlin', 'London', 'London', 'London'],
     'weather': ['sunny', 'sunny', 'cloudy','sunny', 'cloudy', 'cloudy'], 'temp': [20,22,19, 21, 18, 17]}
df = pd.DataFrame(data=d)
df

    city    weather temp
0   Berlin  sunny   20
1   Berlin  sunny   22
2   Berlin  cloudy  19
3   London  sunny   21
4   London  cloudy  18
5   London  cloudy  17

到这里:

d_2 = {'Berlin_weather': ['sunny', 'sunny', 'cloudy'], 'Berlin_temp': [20,22,19],
     'London_weather': ['sunny', 'cloudy', 'cloudy'], 'London_temp': [21, 18, 17]}
df_2 = pd.DataFrame(data=d_2)
df_2

    Berlin_weather  Berlin_temp London_weather  London_temp
0   sunny           20          sunny           21
1   sunny           22          cloudy          18
2   cloudy          19          cloudy          17

我曾尝试使用 .unstack(),但无法使其正常工作。循环很明显,但我的实际数据集的大小使得它有点不可行。

【问题讨论】:

    标签: python pandas dataframe reshape


    【解决方案1】:

    让我们创建一个新索引然后使用unstack

    df1 = df.set_index([df['city'],df.groupby('city').cumcount()]).drop('city',1).unstack(0)
    

    然后展平多索引列。

    df1.columns = [f'{y}_{x}' for x,y in df1.columns]
    

    print(df1)
    
      Berlin_weather London_weather  Berlin_temp  London_temp
    0          sunny          sunny           20           21
    1          sunny         cloudy           22           18
    2         cloudy         cloudy           19           17
    

    如果顺序很重要,我们可以在展平列之前使用pd.CategoricalIndex

    cati = pd.CategoricalIndex(df1.columns.get_level_values(0).unique(),
                        ['weather','temp'],
                        ordered=True)
    
    df1.columns = df1.columns.set_levels(cati, level=0)
    
    df1 = df1.sort_index(1,1) # level = 1 and axis = 1 -- columns.
    df1.columns = [f'{y}_{x}' for x,y in df1.columns]
    
    
      Berlin_weather  Berlin_temp London_weather  London_temp
    0          sunny           20          sunny           21
    1          sunny           22         cloudy           18
    2         cloudy           19         cloudy           17
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多