首页 > 解决方案 > 从 2D df 中提取并在 python 中将值添加到 1D df

问题描述

我正在尝试从二维数据框中提取信息,其中我有 A 到 H 行和 1-12 列。每个单元格都有不同的编号。我的第二个数据框只有一列包含组合信息,例如 A1、A2 等。我想设置一个 for 循环,以便我可以执行 df1.iloc 并选择坐标。但我不想输入 96 行,所以我认为 for 循环会有所帮助,但我不知道该怎么做。我很新,所以我不太了解这些技巧。

df1 将是:

1 2 3 4 5 6
一种 237 543 300 256 343 122
435 313 150 635 847 321

df2 将是:

well=['A1','A2','A3','B1','B2','B3']

我想做一个看起来像这样的df3:

价值
A1 237
A2 543
A3 300
B1 435
B2 313
B3 150

到目前为止,我所拥有的是:

    df3=pd.DataFrame()
    for i in df2:
        if i.contains('A'):
           row=df1.iloc[1]
           if i.contains('1'):
              value=row.iloc[1]
        df3.append(i,value)

我知道 col # 对于 iloc 将始终相同。那么我可以将 AH 分配为 1-8,然后以某种方式选择 df2 中字母后面的数字作为 iloc 值吗?

标签: pythonpandasdataframe

解决方案


一种选择是往返:stack df1reindexwell

df3 = df1.stack()
df3.index = df3.index.map(lambda s: ''.join(map(str, s)))
df3 = df3.reindex(df2['well']).reset_index(name='Value')

df3

  Well  Value
0   A1    237
1   A2    543
2   A3    300
3   B1    435
4   B2    313
5   B3    150

使用的数据框:

import pandas as pd

df1 = pd.DataFrame({
    1: {'A': 237, 'B': 435}, 2: {'A': 543, 'B': 313},
    3: {'A': 300, 'B': 150}, 4: {'A': 256, 'B': 635},
    5: {'A': 343, 'B': 847}, 6: {'A': 122, 'B': 321}
})

df2 = pd.DataFrame({'well': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

说明:

  1. Stack 产生一个系列:
df3 = df1.stack()

df3

A  1    237
   2    543
   3    300
   4    256
   5    343
   6    122
B  1    435
   2    313
   3    150
   4    635
   5    847
   6    321
dtype: int64

  1. 将 MultiIndex 折叠成单个索引Index.map
df3.index = df3.index.map(lambda s: ''.join(map(str, s)))

df3

A1    237
A2    543
A3    300
A4    256
A5    343
A6    122
B1    435
B2    313
B3    150
B4    635
B5    847
B6    321
dtype: int64

  1. welldf2和抓取reindex
df3 = df3.reindex(df2['well'])
Well
A1    237
A2    543
A3    300
B1    435
B2    313
B3    150
dtype: int64

*如果 well 是listOP 中出现的 a ,则将其转换为Series带有名称的 a ,well然后reindex改为:

well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
df3 = df3.reindex(pd.Series(well, name='well'))

或者reindex直接从,list但是在重置索引之前需要重命名轴:

well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
df3 = df3.reindex(well).rename_axis(index='Well')

  1. reset_index转换为 DataFrame(并为Value列命名):
df3 = df3.reindex(df2['well']).reset_index(name='Value')

df3

  Well  Value
0   A1    237
1   A2    543
2   A3    300
3   B1    435
4   B2    313
5   B3    150

推荐阅读