gpt4 book ai didi

python - 如何在 Pandas 中从列转向行

转载 作者:行者123 更新时间:2023-12-04 15:00:47 26 4
gpt4 key购买 nike

data = [[1, 'tom', 10, 53, 2, 3, 9, 6 ], [2, 'nick', 1, 53, 2, 23, 4, 7], [3, 'juli', 9, 23, 2, 31, 9, 3]]

df = pd.DataFrame(data, columns = ['ID', 'Name', 'Apple.Food.0', 'Apple.Food.1', 'Apple.Food.2', 'Pear.Food.0', 'Pear.Food.1', 'Pear.Food.2'])

df
<表类="s-表"><头>身份证姓名Apple.Food.0Apple.Food.1Apple.Food.2Pear.Food.0Pear.Food.1Pear.Food.2<正文>1汤姆105323962尼克153223473七里92323193

我想解压缩最后 6 列以喜欢:即 Apple.Food.0 - 将前缀“Apple”解包到行,将后缀“0”解包到行,将“Food”保留为列名并将值保留在那里;然后重新生成 ID 列作为 PK。

我尝试使用 .str.split() 来拆分列,但是,该值将随所有的 splited 列一起提供。任何内置的 pandas 函数都可以轻松实现这一点吗?

<表类="s-表"><头>身份证姓名水果时间食物<正文>1汤姆苹果0102汤姆苹果1533汤姆苹果224汤姆梨035汤姆梨196汤姆梨267尼克苹果018尼克苹果1539尼克苹果2210尼克梨02311尼克梨1412尼克梨2713七里苹果0914七里苹果12315七里苹果2216七里梨03117七里梨1918七里梨23

最佳答案

使用DataFrame.set_index对于 MultiIndex 列没有 . 首先,然后是 str.split带柱子,通过 DataFrame.stack reshape , 通过 DataFrame.rename_axis 检查索引名称最后添加 DataFrame.reset_index :

df1 = df.set_index(['ID','Name'])
df1.columns = df1.columns.str.split('.', expand=True)
df1 = df1.stack([0,2]).rename_axis(['ID','Name','Fruit','Time']).reset_index()
print (df1)
ID Name Fruit Time Food
0 1 tom Apple 0 10
1 1 tom Apple 1 53
2 1 tom Apple 2 2
3 1 tom Pear 0 3
4 1 tom Pear 1 9
5 1 tom Pear 2 6
6 2 nick Apple 0 1
7 2 nick Apple 1 53
8 2 nick Apple 2 2
9 2 nick Pear 0 23
10 2 nick Pear 1 4
11 2 nick Pear 2 7
12 3 juli Apple 0 9
13 3 juli Apple 1 23
14 3 juli Apple 2 2
15 3 juli Pear 0 31
16 3 juli Pear 1 9
17 3 juli Pear 2 3

性能:

#3k rows
df = pd.concat([df] * 1000, ignore_index=True)

def f1():
df1 = df.set_index(['ID','Name'])
df1.columns = df1.columns.str.split('.', expand=True)
df1 = df1.stack([0,2]).rename_axis(['ID','Name','Fruit','Time']).reset_index()

def f2():
x = df.melt(['ID', 'Name'], value_name='Food')
x[['Fruit', 'Time']] = x.variable.str.split('.', expand=True)[[0,2]]
x = x.sort_values(['ID', 'Fruit']).reset_index(drop=True).drop('variable', 1)


In [41]: %timeit f1()
27.4 ms ± 1.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [42]: %timeit f2()
53.1 ms ± 1.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 如何在 Pandas 中从列转向行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66998010/

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