我在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 列,但解决方案应该足够通用以适应这一点。
答案 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
为多个变量构建一般情况有点棘手。这是一个解决方案,它基于您对c
和d
进行欺骗的情况。它仍然使用melt()
,但随后将所有c
变体重命名为c
,并将d
重命名为c
。然后它基本上将d
和df['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