python - 如何将 Pandas 列切片转置并插入到行切片中?

标签 python pandas insert slice transpose

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

除了for循环之外,还尝试过.loc、.iloc、转置,但没有成功。 hub、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 target dataframe

df2 source dataframe

# 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。

Desired df1 output geometry

如何提取切片、转置和插入而不对每个值进行 for 循环?

最佳答案

将值转换为 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

关于python - 如何将 Pandas 列切片转置并插入到行切片中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970347/

相关文章:

列表理解中的python可迭代列表理解

Python - Pandas - 编辑重复的项目保留在最后

python - 删除连续的重复项。离开中间

python - Pandas Dataframe 找到接下来几行中的最大值

mysql - 经典数据库插入问题

MySQL 如果表不存在则插入

Python __init__.py,较少污染的命名空间

python - 如何使用 findall 打印正则表达式的结果?

python - 替换有时加倍的字符的单个实例

sql - 将数据从一个表复制到另一个表时,使用参数还是列值更好?