Pandas - 将列值拆分为新列

时间:2016-06-15 15:43:58

标签: python pandas dataframe

我有一个大型数据框,我存储了许多冗余值,这些值使得我很难处理数据。我有一个格式的数据框:

import pandas as pd

df = pd.DataFrame([["a","g","n1","y1"], ["a","g","n2","y2"], ["b","h","n1","y3"], ["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])

>>> df

  meta1 meta2 name data
    a     g   n1   y1
    a     g   n2   y2
    b     h   n1   y3
    b     h   n2   y4

我在name中有我想要的新列的名称以及data中的相应数据。

我想生成以下形式的数据框:

df = pd.DataFrame([["a","g","y1","y2"], ["b","h","y3","y4"]], columns=["meta1", "meta2", "n1", "n2"])

>>> df

meta1 meta2  n1  n2
  a     g  y1  y2
  b     h  y3  y4

名为meta的列大约有15个以上包含大部分数据的列,我认为它不适合索引。我的想法是,我目前在meta中存储了大量重复/冗余数据,我希望生成更紧凑的数据帧。

我找到了一些类似的Q但是无法确定我需要做什么样的操作:转动,重新索引,堆叠或拆散等等?

PS - 原始索引值对我来说并不重要。

非常感谢任何帮助。

问题我认为是相关的:

我认为以下Q与我要做的事情有关,但我看不到如何应用它,因为我不想生成更多的索引。

2 个答案:

答案 0 :(得分:5)

如果将元列分组到列表中,则可以执行以下操作:

metas = ['meta1', 'meta2']

new_df = df.set_index(['name'] + metas).unstack('name')
print new_df

            data    
name          n1  n2
meta1 meta2         
a     g       y1  y2
b     h       y3  y4

它可以帮助你完成大部分工作。额外的剪裁可以让你完成其余的工作。

print new_df.data.rename_axis([None], axis=1).reset_index()

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

答案 1 :(得分:4)

您可以将pivot_tablereset_indexrename_axis一起使用(pandas 0.18.0中的新内容):

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc='first')
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

但更好的是使用aggfunc join

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc=', '.join)
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2  n1  n2
0     a     g  y1  y2
1     b     h  y3  y4

解释,为什么join通常更好first

如果使用first,您可能会丢失index之前不是每组中第一个的所有数据,但join会将它们连接起来:

import pandas as pd

df = pd.DataFrame([["a","g","n1","y1"], 
                   ["a","g","n2","y2"], 
                   ["a","g","n1","y3"], 
                   ["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])

print (df)
  meta1 meta2 name data
0     a     g   n1   y1
1     a     g   n2   y2
2     a     g   n1   y3
3     b     h   n2   y4

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc='first')
         .reset_index()
         .rename_axis(None, axis=1))
  meta1 meta2    n1  n2
0     a     g    y1  y2
1     b     h  None  y4

print (df.pivot_table(index=['meta1','meta2'], 
                      columns='name', 
                      values='data', 
                      aggfunc=', '.join)
         .reset_index()
         .rename_axis(None, axis=1))

  meta1 meta2      n1  n2
0     a     g  y1, y3  y2
1     b     h    None  y4