如何将Pandas DataFrame的每一行转换为新的nxm矩阵?

问题描述 投票:1回答:2

嗨,我已经生成了如下数据框:

Data     mS1  nS1   mS1S2   nS1S2
KC        1    9     1       18
KN        1    9     0       19
KD        1    9     1       18
NG        0    10    2       17

现在,我想将每一行转换为一个新的2x2矩阵:第一和第三,第二和第四列

例如,对于KC:

 KC  1  1
-KC  9  18
python python-3.x pandas dataframe reshape
2个回答
1
投票

使用Data字段中的键,创建字典或列表推导式,然后使用numpy.ndarray.reshape。看起来还需要使用numpy.ndarray.reshape来获得所需的输出:

order='F'

[out]

d = {i: pd.DataFrame(r.to_numpy().reshape(2, 2, order='F'),
                     index=[f'{i}', f'-{i}'],
                     columns=['A', 'B'])
     for i, r in df.set_index('Data').iterrows()}

print(d['KC'])

     A   B
KC   1   1
-KC  9  18

[out]

l = [pd.DataFrame(r.to_numpy().reshape(2, 2, order='F'),
                  index=[f'{i}', f'-{i}'],
                  columns=['A', 'B'])
     for i, r in df.set_index('Data').iterrows()]

for d in l:
    print(d)

1
投票

条件不明确,但是可以解决此玩具问题的方法是:

     A   B
KC   1   1
-KC  9  18

     A   B
KN   1   0
-KN  9  19

     A   B
KD   1   1
-KD  9  18

      A   B
NG    0   2
-NG  10  17

您会得到一个包含4个数据帧的字典import pandas as pd df = pd.DataFrame({'mS1':[1,1,1,0], 'nS1':[9,9,9,10], 'mS1S2':[1,0,1,2], 'nS1S2':[18,10,19,17]}, index = ['KC', 'KN', 'KD', 'NG']) d = {} for r in df.itertuples(): d[r[0]] = pd.DataFrame({'A':[r[1],r[3]], 'B':[r[2],r[4]]}, index = ['{}'.format(r[0]), '-{}'.format(r[0])]) d

d
© www.soinside.com 2019 - 2024. All rights reserved.