列名称为值时,熊猫会拆分DataFrame

时间:2019-05-16 09:43:18

标签: python pandas dataframe

我有一个格式不正确的数据框,看起来像

0  1
col_name1     val1
col_name2     val2
col_name3     val3
col_name1     val4
col_name2     val5
col_name3     val6
.  .             .
.  .             .

我想使它看起来像

col_name1,col_name2,col_name3
val1,val2,val3
val4,val5,val6

我该如何拆分?

我试图转置数据框,但对于某些groupby操纵却无法正常工作。

5 个答案:

答案 0 :(得分:1)

您可以使用:

m=df.groupby('0')['1'].apply(list)
df1=pd.DataFrame(m.values.tolist(),index=m.index).T.rename_axis(None,axis=1)
print(df1)

  col_name1 col_name2 col_name3
0      val1      val2      val3
1      val4      val5      val6

答案 1 :(得分:1)

new_df = {i:[] for i in list(set(df["0"]))}
for i in range(len(df)):
    new_df[df["0"][i]].append(df["1"][i])

Result
col_name2 col_name3 col_name1
0      val2      val3      val1
1      val5      val6      val4

答案 2 :(得分:1)

如果行顺序是一致的,则可以在使用int(index / 3)添加新的伪索引后,只需旋转数据框即可:

df['ndx'] = (df.index / 3).astype(int)
df = df.pivot(index='ndx', columns='0', values='1')

如果不确定,如果col_name1始终位于第一位,则此方法会更可靠:

df['ndx'] = pd.Series(np.where(df['0'] == 'col_name1', df.index, np.nan),
                      index = df.index).fillna(method='ffill').astype(int)
df = df.pivot(index='ndx', columns='0', values='1')

答案 3 :(得分:1)

您在这里:

原始DataFrame

enter image description here

STEP1 :按“第一列”对数据进行分组

someComponent

STEP2: 获取列名以获取新数据框:

df_temp = df.groupby(0)[1].apply(list)

STEP3: 获取行值并将其存储在列表中:

col_names = df_temp.index

STEP4: 以所需的格式制作新的数据框

row_values = df_temp.values.tolist()

enter image description here

答案 4 :(得分:1)

DataFrame.set_indexGroupBy.cumcount一起用于MultiIndex,并通过Series.unstack重塑形状:

df = df.set_index([df.groupby(0).cumcount(), 0])[1].unstack().rename_axis(None, axis=1)
print (df)
  col_name1 col_name2 col_name3
0      val1      val2      val3
1      val4      val5      val6