我有一个格式不正确的数据框,看起来像
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操纵却无法正常工作。
答案 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
STEP1 :按“第一列”对数据进行分组
someComponent
STEP2: 获取列名以获取新数据框:
df_temp = df.groupby(0)[1].apply(list)
STEP3: 获取行值并将其存储在列表中:
col_names = df_temp.index
STEP4: 以所需的格式制作新的数据框:
row_values = df_temp.values.tolist()
答案 4 :(得分:1)
将DataFrame.set_index
与GroupBy.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