gpt4 book ai didi

python - 合并 DataFrame 中的列

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:18 25 4
gpt4 key购买 nike

有一个像这样的数据框:

import pandas

df = pandas.DataFrame({'a': [1, 2, 3], 'b': [9, 8, 7], 'c': [4, 5, 6]})
df

enter image description here

我想要一个数据框:

  • 因素/类别列['a', 'b']。这个专栏的名字,我不在乎。
  • 具有 ab 列旧值的列,具体取决于 ['a', 'b']因素。这个专栏的名字,我不在乎。
  • 保留 c 列值和名称(实际数据框有几列我想保留)。
  • 我不关心结果数据框中列的顺序,也不关心其中的某些(或任何)是否设置为索引。

这是我想要得到的示例:

df['name_a'] = 'a'
df['name_b'] = 'b'

c0 = pandas.concat([df['name_a'], df['name_b']])
c1 = pandas.concat([df['a'], df['b']])
c2 = pandas.concat([df['c'], df['c']])

newdf = pandas.concat([c0, c1, c2], axis=1)
newdf

enter image description here

是否有更好的方法来达到相同的结果?我觉得这样很丑陋。也许我缺少一个 pandas 函数,它使代码更加清晰且易于理解?

最佳答案

我认为你需要melt :

print (pd.melt(df,id_vars='c', var_name='0', value_name='1'))
c 0 1
0 4 a 1
1 5 a 2
2 6 a 3
3 4 b 9
4 5 b 8
5 6 b 7

另一个解决方案 stacksort_values :

df1 = df.set_index('c').stack().reset_index().sort_values('level_1')
df1.columns = ['c', '0','1']
print (df1)
c 0 1
0 4 a 1
2 5 a 2
4 6 a 3
1 4 b 9
3 5 b 8
5 6 b 7

更通用的解决方案 - 使用列表理解来过滤除ab变量cols之外的所有列>:

cols = [col for col in df.columns if col not in ['a','b']]
print (cols)
['c']

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1'))
c 0 1
0 4 a 1
1 5 a 2
2 6 a 3
3 4 b 9
4 5 b 8
5 6 b 7

添加另一列的示例g:

df = pd.DataFrame({'a': [1, 2, 3], 
'b': [9, 8, 7],
'c': [4, 5, 6],
'g': [0, 1, 7]})

print (df)
a b c g
0 1 9 4 0
1 2 8 5 1
2 3 7 6 7

cols = [col for col in df.columns if col not in ['a','b']]
print (cols)
['c', 'g']

使用 numpy.setdiff1d 更快地解决问题:

cols = np.setdiff1d(df.columns, ['a','b']).tolist()
print (cols)
['c', 'g']

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1'))
c g 0 1
0 4 0 a 1
1 5 1 a 2
2 6 7 a 3
3 4 0 b 9
4 5 1 b 8
5 6 7 b 7

关于python - 合并 DataFrame 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40379941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com