python - pd.melt() 字典/一系列数据帧

标签 python excel pandas dataframe dictionary

例如我有以下 map :

  {'df1': Jan    Feb    Mar
           1      3      5
           2      4      6
   'df2': Jan    Feb    Mar
           7      9      11
           8      10     12
    ......}

我想要以下输出:

Jan  1
Jan  2
Feb  3
Feb  4
Mar  5
Mar  6
Jan  7
Jan  8
Feb  9
Feb  10
Mar  11
Mar  12

有谁知道是否可以这样做? 我尝试过的是迭代 DataFrames 来尝试获取

  {'df1': Jan  1
          Jan  2
          Feb  3
          Feb  4
          Mar  5
          Mar  6

   'df2': Jan  7
          Jan  8
          Feb  9
          Feb  10
          Mar  11
          Mar  12

通过使用

for x in dfMap:
    df = pd.melt(list(x.values()))

然后尝试用 df1m = 连接它

pd.concat(df.values(), ignore_index=True)

这给了我错误

AttributeError: 'list' object has no attribute 'columns'

我对编程相当陌生,真的很想学习,如果有人能解释它是如何工作的,以及为什么 list 或 dict_values 对象没有属性“列”,那就太好了。

提前致谢!

最佳答案

您可以连接和堆叠:

out = pd.concat(d.values()).stack().droplevel(0)

或者:

out = pd.concat(d.values()).melt()

示例:

df = pd.DataFrame(np.arange(1,10).reshape(-1,3),columns=['Jan','Feb','Mar'])
d = {}
for e,i in df.iterrows():
    d[f"df{e+1}"] = i.to_frame().T
print(d,'\n')

out = pd.concat(d.values()).stack().droplevel(0)
print(out)

    {'df1':    Jan  Feb  Mar
0    1    2    3, 'df2':    Jan  Feb  Mar
1    4    5    6, 'df3':    Jan  Feb  Mar
2    7    8    9} 

Jan    1
Feb    2
Mar    3
Jan    4
Feb    5
Mar    6
Jan    7
Feb    8
Mar    9
dtype: int32

随着融化:

out = pd.concat(d.values()).melt()
print(out)

  variable  value
0      Jan      1
1      Jan      4
2      Jan      7
3      Feb      2
4      Feb      5
5      Feb      8
6      Mar      3
7      Mar      6
8      Mar      9

编辑,对于已编辑的问题,请尝试:

out = pd.concat(d).stack().sort_index(level=[0,-1]).droplevel([0,1])

示例如下:

df = pd.DataFrame(np.arange(1,13).reshape(3,-1).T,columns=['Jan','Feb','Mar'])
d = {}
for e,i in df.groupby(df.index//2):
    d[f"df{e+1}"] = i
print(d,'\n')

out = pd.concat(d).stack().sort_index(level=[0,-1]).droplevel([0,1])
print(out)

{'df1':    Jan  Feb  Mar
0    1    5    9
1    2    6   10, 'df2':    Jan  Feb  Mar
2    3    7   11
3    4    8   12} 

Jan     1
Jan     2
Feb     5
Feb     6
Mar     9
Mar    10
Jan     3
Jan     4
Feb     7
Feb     8
Mar    11
Mar    12
dtype: int32

或者您也可以将数据帧名称转换为 int 然后排序:

out = (pd.concat(d.values(),keys=[int(key[2:]) for key in d.keys()])
   .stack().sort_index(level=[0,-1]).droplevel([0,1]))

关于python - pd.melt() 字典/一系列数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65547087/

相关文章:

python - 如何有效地查找多维数组中相似元素的簇

python - 使用带 zip 压缩的 pandas read_csv

excel - 如何知道组合框是否有项目?

Pandas 不将单个行条目注册为单个列条目

python - python中循环的向量化

python - NumPy 的[...,无]

python - GAE + Javascript 推送 : multiline to push

excel - 如何使用 Selenium 在 Headless 模式下使用 Google Chrome 查找 XPath?

javascript - Excel 在线 |返回单元格公式 - Javascript

python - 将值分配给 pandas 数据框中的不可散列列表