【问题标题】:Appending columns to a new dataframe将列附加到新数据框
【发布时间】:2019-01-22 10:46:33
【问题描述】:

我有一个看起来像这样的数据框。

df =

    0   1   2   3   4
0   0.5 0.4 0.3 0.2 0.1
1   0.5 0.4 0.3 0.2 0.1
2   0.5 0.4 0.3 0.2 0.1
3   0.5 0.4 0.3 0.2 0.1

还有一个看起来像这样的列表。

dir = [[0,1,2],[3,4]] 

我想要做的是创建一个新的空数据框,并根据列表用附加的列填充它。为此,我需要遍历列表并附加相应的列。这是所需的输出:

    0    1
0   0.5  0.2
1   0.5  0.2
2   0.5  0.2
3   0.5  0.2
4   0.4  0.1
5   0.4  0.1
6   0.4  0.1
7   0.4  0.1
8   0.3
9   0.3
10  0.3
11  0.3

这是我的代码尝试:

new_df = pd.DataFrame()
for i in dir:
    for j in i:
        new_df.append([df[i]])

但是每次都会覆盖新的数据帧而不是追加,并且还会将数据追加为行而不是列。

编辑 以下解决方案适用于等长列表的列表:

L = [[0,1],[2,3]]

df = pd.DataFrame(np.hstack([df[x].values.T.ravel()[:, None] for x in L]))
print (df)

但是我需要一个可以处理不同长度列表的解决方案(即 list = [ [0,1,2], [3,4] ])

【问题讨论】:

    标签: python list pandas dataframe append


    【解决方案1】:

    使用numpy.hstack 防止使用DataFrame 构造函数按列名对齐列:

    L = [[0,1],[2,3]]
    
    df = pd.DataFrame(np.hstack([df[x].values.T.ravel()[:, None] for x in L]))
    print (df)
    
         0    1
    0  0.5  0.3
    1  0.5  0.3
    2  0.5  0.3
    3  0.5  0.3
    4  0.4  0.2
    5  0.4  0.2
    6  0.4  0.2
    7  0.4  0.2
    

    编辑:对于一般解决方案,请创建 Series 并通过 concat 加入:

    L = [[0,1,2],[3,4]] 
    
    df = pd.concat([pd.Series(df[x].values.T.ravel()) for x in L], axis=1)
    print (df)
          0    1
    0   0.5  0.2
    1   0.5  0.2
    2   0.5  0.2
    3   0.5  0.2
    4   0.4  0.1
    5   0.4  0.1
    6   0.4  0.1
    7   0.4  0.1
    8   0.3  NaN
    9   0.3  NaN
    10  0.3  NaN
    11  0.3  NaN
    

    【讨论】:

    • 也许,我认为,只是轻微的结构调整可以匹配 op 的预期输出。
    • pd.DataFrame(np.vstack([df[x].values.T.ravel() for x in l]).T)
    • 感谢@jezrael,这些对示例非常有效。但这适用于包含以下内容的列表:list = [ [0,1,2], [3,4], [5], [6,7,8,9,10], [11,12 ] ] ?
    • 您的解决方案@Wen 的同样问题 :) 它适用于具有不同形状的列表列表吗?
    【解决方案2】:

    使用melt

    l=[[0,1],[2,3]]
    d={x : df[y].melt().value.tolist()  for x,y in enumerate(l)}
    pd.DataFrame(d)
    Out[171]: 
         0    1
    0  0.5  0.3
    1  0.5  0.3
    2  0.5  0.3
    3  0.5  0.3
    4  0.4  0.2
    5  0.4  0.2
    6  0.4  0.2
    7  0.4  0.2
    

    【讨论】:

    • 感谢@Wen,这对于给出的示例很有效。这需要如何更改以接受具有不同长度的列表列表?例如列表 = [ [0,1,2], [3,4], [5], [6,7] ]
    猜你喜欢
    • 2018-04-06
    • 2021-10-08
    • 1970-01-01
    • 2021-11-07
    • 2021-06-06
    • 2018-07-15
    • 2017-10-17
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多