gpt4 book ai didi

python - 如何将 m×m 数据帧转换为 pandas 中的 m*m×3 数据帧?

转载 作者:行者123 更新时间:2023-11-28 22:14:14 26 4
gpt4 key购买 nike

我有一个像这样的 pandas 数据框:

df = pd.DataFrame({'A':[1,3,2,9],'B':[2,1,2,7],'C':[7,2,4,6],'D':[8,1,6,4]},index=['A','B','C','D'])

>> A B C D
A 1 2 7 8
B 3 1 2 1
C 2 2 4 6
D 9 7 6 4

我想将此数据框更改为具有相应值的对,如下所示:

>> col1 col2 val
A A 1
A B 3
A C 2
A D 9
... ... ...
D C 6
D D 4

一种方法是使用循环,但对于非常大的数据帧,这会非常慢。有一些问题解决了类似的问题,但对于 R。我猜的一种方法是将数据帧转换为 numpy 矩阵,然后使用堆栈函数。但我无法从中创建一个 m×3 数组。有人可以帮忙吗?

最佳答案

使用DataFrame.stackSeries.reset_index :

df = df.stack().reset_index()
df.columns = ['col1','col2','val']

或使用 numpy.repeat 的 numpy 解决方案, numpy.tileravel :

a = np.repeat(df.index, len(df.columns))
b = np.tile(df.columns, len(df))
c = df.values.ravel()

df = pd.DataFrame({'col1':a,'col2':b,'val':c})

print (df)
col1 col2 val
0 A A 1
1 A B 2
2 A C 7
3 A D 8
4 B A 3
5 B B 1
6 B C 2
7 B D 1
8 C A 2
9 C B 2
10 C C 4
11 C D 6
12 D A 9
13 D B 7
14 D C 6
15 D D 4

val 列顺序不同的解决方案 meltDataFrame.reset_index , 对于相同的列顺序添加 reindex :

df = (df.rename_axis('col2')
.reset_index()
.melt('col2', var_name='col1', value_name='val')
.reindex(columns=['col1','col2','val']))

a = np.repeat(df.columns, len(df.columns))
b = np.tile(df.index, len(df))
c = df.values.T.ravel()

df1 = pd.DataFrame({'col1':a,'col2':b,'val':c})

print (df)

col1 col2 val
0 A A 1
1 A B 3
2 A C 2
3 A D 9
4 B A 2
5 B B 1
6 B C 2
7 B D 7
8 C A 7
9 C B 2
10 C C 4
11 C D 6
12 D A 8
13 D B 1
14 D C 6
15 D D 4

关于python - 如何将 m×m 数据帧转换为 pandas 中的 m*m×3 数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501706/

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