熊猫重复列成新行

时间:2017-11-05 23:58:48

标签: python pandas csv

我在csv中有数据有一些列重复,我想创建多行重复一些列。我试图用Python中的pandas来做这件事。

将以下内容作为MWE。我使用df = pandas.read_csv('my.csv')导入我的数据,并且具有如下所示的内容:

a  b  c  c.1  c.2
1  2  3   4    5
6  7  8   9    0

可以看到列 a b 是唯一的,但 c 有多个值。我想将 c 值拆分为单独的行,复制 a b ,即实现以下目标:

a  b  c
1  2  3
1  2  4
1  2  5
6  7  8
6  7  9
6  7  0

为了不必输入太多,我遗漏了一个类似重复的 d 列,但解决方案应该足够通用以适应这一点。

3 个答案:

答案 0 :(得分:3)

In [426]: pd.lreshape(df, {'c':df.columns[df.columns.str.match('^c\.?\d?')]})
Out[426]:
   a  b  c
0  1  2  3
1  6  7  8
2  1  2  4
3  6  7  9
4  1  2  5
5  6  7  0

答案 1 :(得分:2)

使用melt

pd.melt(df, id_vars=['a','b'], value_name='c').drop('variable',1)

输出:

   a  b  c
0  1  2  3
1  6  7  8
2  1  2  4
3  6  7  9
4  1  2  5
5  6  7  0

为多个变量构建一般情况有点棘手。这是一个解决方案,它基于您对cd进行欺骗的情况。它仍然使用melt(),但随后将所有c变体重命名为c,并将d重命名为c。然后它基本上将ddf['d'] = df.c df['d.1'] = df['c.1'] df['d.2'] = df['c.2'] df2 = pd.melt(df, id_vars=['a','b']) df2.variable = df2.variable.str.replace('^(c|d).*', '\\1') dupe_vars = ['c','d'] (df2.loc[df2.variable.eq('c')] .rename(columns={'value':'c'}) .drop('variable',1) .reset_index(drop=True).merge( df2.loc[df2.variable.eq('d')] .rename(columns={'value':'d'}) .drop('variable',1) .reset_index(drop=True), left_index=True, right_index=True, on=['a','b'])) a b c d 0 1 2 3 3 1 6 7 8 8 2 1 2 4 4 3 6 7 9 9 4 1 2 5 5 5 6 7 0 0 段分开并合并它们。它有点笨重。

{{1}}

答案 2 :(得分:1)

df.set_index(['a','b']).stack().reset_index().drop('level_2',1).rename(columns={0:'c'})
Out[754]: 
   a  b  c
0  1  2  3
1  1  2  4
2  1  2  5
3  6  7  8
4  6  7  9
5  6  7  0