【问题标题】:Transform data frame to a different form将数据框转换为不同的形式
【发布时间】:2021-11-21 20:23:04
【问题描述】:

这是我的数据框。

Date Country Value
1/4/1971 Sweden 5.1643
1/5/1971 Sweden 5.1628
1/6/1971 Sweden 5.1614
1/7/1971 Sweden 5.1649
1/8/1971 Sweden 5.1631
1/4/1971 Canada 1.0109
1/5/1971 Canada 1.0102
1/6/1971 Canada 1.0106
1/7/1971 Canada 1.0148
1/8/1971 Canada 1.0154
1/4/1971 India 8.02
1/5/1971 India 8.00
1/6/1971 India 8.01
1/7/1971 India 8.00
1/8/1971 India 8.03

我想要上面的数据框,像下面使用 python 和 panda。

Date Sweden Canada India
1/4/1971 5.1643 1.0109 8.02
1/5/1971 5.1628 1.0102 8
1/6/1971 5.1614 1.0106 8.01
1/7/1971 5.1649 1.0148 8
1/8/1971 5.1631 1.0154 8.03

请帮助我。 谢谢。

【问题讨论】:

    标签: python dataframe columnsorting


    【解决方案1】:

    您可以使用数据帧的pivot 方法来做到这一点。

    代码

    以下代码假定原始数据位于名为 test.csv 的文件中。

    import pandas as pd
    
    df = pd.read_csv('test.csv')
    
    print(df)
    
    df = df.pivot(index='Date', columns='Country', values = 'Value').reset_index()
    
    print(df)
    

    之前

    Date Country Value
    1/4/1971 Sweden 5.1643
    1/5/1971 Sweden 5.1628
    1/6/1971 Sweden 5.1614
    1/7/1971 Sweden 5.1649
    1/8/1971 Sweden 5.1631
    1/4/1971 Canada 1.0109
    1/5/1971 Canada 1.0102
    1/6/1971 Canada 1.0106
    1/7/1971 Canada 1.0148
    1/8/1971 Canada 1.0154
    1/4/1971 India 8.02
    1/5/1971 India 8
    1/6/1971 India 8.01
    1/7/1971 India 8
    1/8/1971 India 8.03

    之后

    Country Date Canada India Sweden
    0 1/4/1971 1.0109 8.02 5.1643
    1 1/5/1971 1.0102 8 5.1628
    2 1/6/1971 1.0106 8.01 5.1614
    3 1/7/1971 1.0148 8 5.1649
    4 1/8/1971 1.0154 8.03 5.1631

    【讨论】:

    • 您好 Norie,非常感谢您的回答。它真的很简单而且很有效。
    【解决方案2】:

    我们在这里创建您的数据框进行测试..

    import pandas as pd
    
    arr = [['1/4/1971', 'Sweden', '5.1643'],
           ['1/5/1971', 'Sweden', '5.1628'],
           ['1/6/1971', 'Sweden', '5.1614'],
           ['1/7/1971', 'Sweden', '5.1649'],
           ['1/8/1971', 'Sweden', '5.1631'],
           ['1/4/1971', 'Canada', '1.0109'],
           ['1/5/1971', 'Canada', '1.0102'],
           ['1/6/1971', 'Canada', '1.0106'],
           ['1/7/1971', 'Canada', '1.0148'],
           ['1/8/1971', 'Canada', '1.0154'],
           ['1/4/1971', 'India', '8.02'],
           ['1/5/1971', 'India', '8.00'],
           ['1/6/1971', 'India', '8.01'],
           ['1/7/1971', 'India', '8.00'],
           ['1/8/1971', 'India', '8.03']]
    df = pd.DataFrame(arr,columns=['Date','Country','Value'])
    print('old form')
    print(df)
    

    输出应该是这样的:

    old form
            Date Country   Value
    0   1/4/1971  Sweden  5.1643
    1   1/5/1971  Sweden  5.1628
    2   1/6/1971  Sweden  5.1614
    3   1/7/1971  Sweden  5.1649
    4   1/8/1971  Sweden  5.1631
    5   1/4/1971  Canada  1.0109
    6   1/5/1971  Canada  1.0102
    7   1/6/1971  Canada  1.0106
    8   1/7/1971  Canada  1.0148
    9   1/8/1971  Canada  1.0154
    10  1/4/1971   India    8.02
    11  1/5/1971   India    8.00
    12  1/6/1971   India    8.01
    13  1/7/1971   India    8.00
    14  1/8/1971   India    8.03
    

    让我们施展魔法吧:

    注意:此代码未优化但运行良好

    table = {}
    for row in df.values:
        date = row[0]
        country = row[1]
        value = row[2]
        if date not in table:table[date] = {country:value}
        else:table[date][country] = value
    
    arr = []
    for date in table.keys():
        row = table[date]
        row = [date,row['Sweden'],row['Canada'],row['India']]
        arr.append(row)
    
    df2 = pd.DataFrame(arr,columns=['Date','Sweden','Canada','India'])
    print('new form')
    print(df2)    
    

    最终的输出应该是

    new form
           Date  Sweden  Canada India
    0  1/4/1971  5.1643  1.0109  8.02
    1  1/5/1971  5.1628  1.0102  8.00
    2  1/6/1971  5.1614  1.0106  8.01
    3  1/7/1971  5.1649  1.0148  8.00
    4  1/8/1971  5.1631  1.0154  8.03
    

    【讨论】:

    • 嗨,Aly,非常感谢您的回答。我想动态创建新列(国家名称),但您是静态创建的。我减弱了@Norie 的回答方式。无论如何,非常感谢您的努力。
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多