连接具有相同ID的Pandas DataFrame的列

时间:2018-07-18 12:47:42

标签: python pandas dataframe data-structures jupyter-notebook

我有一个名为weather的DataFrame,其结构如下:

    STATION     DATE        ELEM    VALUE
0   US1MNCV0008 20170101    PRCP    0
1   US1MNCV0008 20170101    SNOW    0
2   US1MISW0005 20170101    PRCP    0
3   US1MISW0005 20170101    SNOW    0
4   US1MISW0005 20170101    SNWD    0

我想使用日期和桩号合并行以获得以下内容:

    STATION     DATE        ELEM  VALUE ELEM  VALUE ELEM VALUE
0   US1MNCV0008 20170101    PRCP  0     SNOW  0
1   US1MISW0005 20170101    PRCP  0     SNOW  0     SNWD    0

我正在尝试通过使用以下方法来实现这一目标:

weather.groupby(['station', as_index=False).agg(lambda x: x.tolist())

但这会创建列表,这不是我想要的。我该如何进行汇总?

1 个答案:

答案 0 :(得分:2)

您可以使用:

df = (df.set_index(['STATION','DATE', df.groupby(['STATION','DATE']).cumcount()])
        .unstack()
        .sort_index(axis=1, level=1))
df.columns = ['{}_{}'.format(i, j) for i, j in df.columns]
df = df.reset_index()
print (df)
       STATION      DATE ELEM_0  VALUE_0 ELEM_1  VALUE_1 ELEM_2  VALUE_2
0  US1MISW0005  20170101   PRCP      0.0   SNOW      0.0   SNWD      0.0
1  US1MNCV0008  20170101   PRCP      0.0   SNOW      0.0    NaN      NaN

说明

  1. 通过STATIONDATEcumcount获取每组的计数
  2. 通过set_index创建MultiIndex
  3. unstack重塑
  4. 在列中划分MultiIndex
  5. index转换为reset_index的列

或使用GroupBy.apply为每个组创建DaatFrame,最后一种解决方法与上述相同:

df = (df.groupby(['STATION','DATE'])['ELEM','VALUE']
       .apply(lambda x: pd.DataFrame(x.values, columns=x.columns))
       .unstack()
       .sort_index(axis=1, level=1))
df.columns = ['{}_{}'.format(i, j) for i, j in df.columns]
df = df.reset_index()
print (df)
       STATION      DATE ELEM_0 VALUE_0 ELEM_1 VALUE_1 ELEM_2 VALUE_2
0  US1MISW0005  20170101   PRCP       0   SNOW       0   SNWD       0
1  US1MNCV0008  20170101   PRCP       0   SNOW       0    NaN     NaN