根据现有列名在 Pandas DataFrame 中创建新列

Håk*_*kon 11 python pandas

我想解构 pandas DataFrame,使用列标题作为新的数据列,并创建一个包含行索引和列的所有组合的列表。展示比解释更容易:

index_col = ["store1", "store2", "store3"]
cols = ["January", "February", "March"]
values = [[2,3,4],[5,6,7],[8,9,10]]
df = pd.DataFrame(values, index=index_col, columns=cols)
Run Code Online (Sandbox Code Playgroud)

我希望从这个 DataFrame 中获得以下列表:

[['store1', 'January', 2],
 ['store1', 'February', 3],
 ['store1', 'March', 4],
 ['store2', 'January', 5],
 ['store2', 'February', 6],
 ['store2', 'March', 7],
 ['store3', 'January', 8],
 ['store3', 'February', 9],
 ['store3', 'March', 10]]
Run Code Online (Sandbox Code Playgroud)

有没有方便的方法来做到这一点?

d.b*_*d.b 10

df.unstack().swaplevel().reset_index().values.tolist()
#OR
df.reset_index().melt(id_vars="index").values.tolist()
# [['store1', 'January', 2],
#  ['store2', 'January', 5],
#  ['store3', 'January', 8],
#  ['store1', 'February', 3],
#  ['store2', 'February', 6],
#  ['store3', 'February', 9],
#  ['store1', 'March', 4],
#  ['store2', 'March', 7],
#  ['store3', 'March', 10]]
Run Code Online (Sandbox Code Playgroud)

接下来,元素的顺序将与问题中的输出匹配。

df.transpose().unstack().reset_index().values.tolist()
# [['store1', 'January', 2],
#  ['store1', 'February', 3],
#  ['store1', 'March', 4],
#  ['store2', 'January', 5],
#  ['store2', 'February', 6],
#  ['store2', 'March', 7],
#  ['store3', 'January', 8],
#  ['store3', 'February', 9],
#  ['store3', 'March', 10]]
Run Code Online (Sandbox Code Playgroud)

  • @LarrytheLlama,如果顺序很重要,你可以执行 `df.unstack().swaplevel().reset_index().sort_values("level_0").values.tolist()` (2认同)

小智 6

真正的熊猫风格:

lst = [[*k, v] for k, v in df.unstack().swaplevel().to_dict().items()]
Run Code Online (Sandbox Code Playgroud)