【问题标题】:How to transpose and insert a Pandas column slice into a row slice?如何将 Pandas 列切片转置并插入行切片?
【发布时间】:2019-07-10 12:05:38
【问题描述】:

尝试从一个 Pandas 数据帧中获取列的切片,转置切片,然后将其插入到不同数据帧中大小相似的行切片中。两个数据框中的标签和索引是不同的。对于大型数据框,我目前正在运行一个 for 循环来复制每个单独的值,就像是逐个单元格一样,但效率极低。

除了for-loop,尝试过.loc、.iloc、转置,但没有成功。 pivot、pivot_table、melt 似乎在这里不适用,或者我无法理解如何将它们应用于这个看似简单的问题。

# Two dataframes here
import pandas as pd
import numpy as np
numRng = np.arange(20).reshape((5, 4))
df1 = pd.DataFrame(numRng)
newCols = ('A', 'B', 'C', 'D', 'E', 'F')
for newCol in newCols:
    df1[newCol] = np.nan 
numRng2 = np.arange(1000,976,-1).reshape((6, 4))
df2 = pd.DataFrame(numRng2)
df2.columns = ['M', 'N', 'O', 'P'] 

df1

df2

# From df1, trying to copy a column-slice, transpose it, and insert it 
# into df2 row-slice, has no effect
df1.loc[1, 'B':'E'] = df2.loc[1:4, 'M'].transpose()
df1

# 'Manual' implementation to produce desired df1 geometry
df1.loc[1, 'B'] = 996
df1.loc[1, 'C'] = 992
df1.loc[1, 'D'] = 988
df1.loc[1, 'E'] = 984
df1

在上面的示例 df 中,在 df1 row1 列中,B、C、D、E 列在行切片中显示数字 996、992、988 和 984。

如何在不循环每个值的情况下提取切片、转置和插入?

【问题讨论】:

    标签: python pandas insert slice transpose


    【解决方案1】:

    将值转换为 numpy 数组以避免数据对齐 - pandas 尝试匹配索引和列,如果失败,创建缺失值或不分配值:

    #pandas 0.22+
    df1.loc[1, 'B':'E'] = df2.loc[1:4, 'M'].transpose().to_numpy()
    #pandas below
    #df1.loc[1, 'B':'E'] = df2.loc[1:4, 'M'].transpose().values
    
    print (df1)
        0   1   2   3   A      B      C      D      E   F
    0   0   1   2   3 NaN    NaN    NaN    NaN    NaN NaN
    1   4   5   6   7 NaN  996.0  992.0  988.0  984.0 NaN
    2   8   9  10  11 NaN    NaN    NaN    NaN    NaN NaN
    3  12  13  14  15 NaN    NaN    NaN    NaN    NaN NaN
    4  16  17  18  19 NaN    NaN    NaN    NaN    NaN NaN
    

    【讨论】:

    • 谢谢耶斯瑞尔。我之前确实尝试过一些 to_numpy 的变体,但没有成功。您的简单版本运行良好。
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 2018-01-30
    • 1970-01-01
    • 2022-08-09
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多