Как транспонировать и вставить срез столбца Pandas в срез строки? - PullRequest
1 голос
/ 10 июля 2019

Попытка извлечь фрагмент столбца из одного кадра данных Pandas, транспонировать фрагмент и вставить его в фрагмент строки аналогичного размера в другом кадре данных.Метки и индексы в обоих фреймах данных различны.С большими фреймами данных я в настоящее время запускаю цикл for, чтобы копировать каждое отдельное значение, как бы ячейка за ячейкой, но невероятно неэффективно.

За исключением цикла for, пробовал .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 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 строки1 B, C, D, E показаны номера 996, 992, 988 и 984 всрез строки.

Desired df1 output geometry

Как извлечь срез, транспонировать и вставить без зацикливания каждого значения?

1 Ответ

1 голос
/ 10 июля 2019

Преобразование значений в массив numpy во избежание выравнивания данных - панды пытаются сопоставить индексы и столбцы друг с другом, а в случае неудачи создают пропущенные значения или не присваивают значения:

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