根据唯一值将单列转换为多列

时间:2019-09-27 12:34:32

标签: pandas

我有以下pandas.DataFrame,形状为(1464, 2)

df = pd.DataFrame()
for name in list('ABCD'):
    temp_df = pd.DataFrame(np.random.randint(0,100,size=(len(date_rng), 1)), columns=['value'], index=date_rng)
    temp_df['name'] = name
    df = df.append(temp_df)

索引列的每个数据重复4次:('ABCD')列中的每个字符串name重复一次。

数据帧的头部和尾部看起来像这样:

value   name
2018-01-01  47  A
2018-01-02  22  A
2018-01-03  13  A
2018-01-04  66  A
2018-01-05  19  A 

尾巴

    value   name
2018-12-28  32  D
2018-12-29  1   D
2018-12-30  5   D
2018-12-31  50  D
2019-01-01  75  D

我想将此(1464, 2)数据帧转换为形状(366, 4),这样4列中的每一个都是df.name.unique()中的4个唯一值(即{{1} }。每列的值是A, B, C, D列中的相应整数。

最终的DataFrame应该看起来像这样:

df.value

与循环和重新创建数据框相反,我确信必须有一个不错的重新索引功能或类似的东西才能有效地执行任务。

2 个答案:

答案 0 :(得分:1)

您可以使用此:

df.pivot(columns='name',values='value')

答案 1 :(得分:0)

您可以使用数据透视表

df = pd.DataFrame([('2018-01-01', '47', 'A'), ('2018-01-02', '22', 'A'), ('2018-01-03', '13', 'A'), ('2018-01-04', '66', 'A'), ('2018-01-05', '19', 'A'), ('2018-01-01', '32', 'D'), ('2018-01-02', '1', 'D'), ('2018-01-03', '5', 'D'), ('2018-01-04', '50', 'D'), ('2018-01-05', '75', 'D')], columns=('id', 'value', 'name'))
df["id"] = pd.to_datetime(df.id)
df.set_index("id")

df.pivot("id", columns="name")

输出

    id  value   name
0   2018-01-01  47  A
1   2018-01-02  22  A
2   2018-01-03  13  A
3   2018-01-04  66  A
4   2018-01-05  19  A
5   2018-01-01  32  D
6   2018-01-02  1   D
7   2018-01-03  5   D
8   2018-01-04  50  D
9   2018-01-05  75  D


value
name    A   D
id      
2018-01-01  47  32
2018-01-02  22  1
2018-01-03  13  5
2018-01-04  66  50
2018-01-05  19  75