gpt4 book ai didi

python - 在 Pandas/Python 中转置复杂的 DataFrame

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:26 24 4
gpt4 key购买 nike

我有一个 pandas DataFrame,由一个对象列表和每个对象的 4 个列表组成,每个列表有 12 个值。它具有一般形式:

Current Data

我想转置数据帧并具有分层索引(“名称”、“4 个列表的名称”)。其一般形式如下所示 Desired Result

我尝试了以下操作,其中 rows_list 是我的源数据:

import pandas as pd

test_table = pd.DataFrame(rows_list, columns=("name", "frac_0", "frac_1","frac_2", "frac_3"))

name = pd.Series(test_table['name'])

del test_table['name']
test_table = test_table.T
test_table = test_table.sort_index([subjectname])

这给了我一个类型错误,指出

"unhashable type: 'list'".

简单的 test_table.T 操作也无法满足我的需求,因为我需要列来对应于(List1、List2 等)中的项目列表,以及要按名称索引的行,然后是List1、List2。我来回添加新列,或尝试从多个系列构建一个全新的 DataFrame,但似乎没有任何效果。

感谢您的帮助!

最佳答案

模拟 df:

df = pd.DataFrame(columns=['Name', 'List 1', 'List 2'], data=[['A', [1,2,3,4], [1,2,3,4]], ['B', [1,2,3,4], [1,2,3,4]], ['C', [1,2,3,4], [1,2,3,4]]])

去掉“名字”:

df.set_index('Name', inplace=True)

List 1 List 2
Name
A [1, 2, 3, 4] [1, 2, 3, 4]
B [1, 2, 3, 4] [1, 2, 3, 4]
C [1, 2, 3, 4] [1, 2, 3, 4]

n_name = len(df.index)
n_list = len(df.columns)
n_item = len(df.iat[0, 0])

df 值现在的形状为 (3,2)。在这个模拟 df 中,我们需要 reshape 为 (6,) 数组以删除一维。然后我们将其制作为一个列表。

vals = list(df.values.reshape((n_list * n_name),))

[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]

现在我们得到了指数水平的值。由于“名称”是第一个级别,我们希望该级别重复下一个级别中唯一值的数量,因此我们使用重复。带有列表的关卡,我们要保持顺序,所以我们使用tile。然后添加您的列名称:

idx_name = np.repeat(df.index.values, n_list)
idx_list = np.tile(df.columns.values, n_name)
columns = ['Col' + str(n) for n in list(range(1, n_item+1))]

创建最终的 df:

df = pd.DataFrame(data=vals, index=[idx_name, idx_list], columns=columns)

Col1 Col2 Col3 Col4
A List 1 1 2 3 4
List 2 1 2 3 4
B List 1 1 2 3 4
List 2 1 2 3 4
C List 1 1 2 3 4
List 2 1 2 3 4

代码:

df = pd.DataFrame(columns=['Name', 'List 1', 'List 2'], data=[['A', [1,2,3,4], [1,2,3,4]], ['B', [1,2,3,4], [1,2,3,4]], ['C', [1,2,3,4], [1,2,3,4]]])

df.set_index('Name', inplace=True)

n_name = len(df.index)
n_list = len(df.columns)
n_item = len(df.iat[0, 0])

vals = list(df.values.reshape((n_list * n_name),))
idx_name = np.repeat(df.index.values, n_list)
idx_list = np.tile(df.columns.values, n_name)
columns = ['Col' + str(n) for n in list(range(1, n_item+1))]

df = pd.DataFrame(data=vals, index=[idx_name, idx_list], columns=columns)

关于python - 在 Pandas/Python 中转置复杂的 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46083606/

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