我正试图从一个2d数据帧中提取信息,其中我有行a到H和列1-12。每个单元格都有不同的编号。我的第二个数据帧只有一列包含组合信息,例如A1、A2等。我想设置一个for循环,这样我就可以执行df1.iloc并选择坐标。但我不想键入96行,所以我认为for循环会很有帮助,但我不知道该怎么做。我是个新手,所以我不太懂窍门。
df1将是:
1 | 2 | 3 | 4 | 5 | 6 | |||
---|---|---|---|---|---|---|---|---|
A | 237 | 543 | 300 | 256343 | 122||||
B | 435 | >313 | 150 | 635 | 847 | >321 |
一个选项是从well
:到stack
df1
和reindex
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']})
解释:
- 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
- 使用
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
- 从
df2
和reindex
抓取well
:
df3 = df3.reindex(df2['well'])
Well
A1 237
A2 543
A3 300
B1 435
B2 313
B3 150
dtype: int64
*如果油井是出现在OP中的list
,则将其转换为名称为well
和reindex
的Series
:
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')
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