【发布时间】:2021-06-06 08:06:55
【问题描述】:
我有 3 个 pandas 多索引列数据框
数据框1(最小值):
| A | B | C |
| Min | Min | Min |
|-------|-------|------|
0 | 26.47 | 17.31 | 1.26 |
1 | 27.23 | 14.38 | 1.36 |
2 | 27.23 | 18.88 | 1.28 |
数据框 2(用于比较的值)
第 0 行、第 1 行和第 2 行相同,我将数据帧扩展到三行,以便与最小和最大数据帧进行比较。每个数据框单元格中的值是 ndarray
| A | B | C |
| Val | Val | Val |
|---------------------|-----------------------|--------------------|
0 | [27.58,28.37,28.73] | [17.31, 18.42, 18.72] | [1.36, 1.28, 1.27] |
1 | [27.58,28.37,28.73] | [17.31, 18.42, 18.72] | [1.36, 1.28, 1.27] |
2 | [27.58,28.37,28.73] | [17.31, 18.42, 18.72] | [1.36, 1.28, 1.27] |
数据帧3(最大值):
| A | B | C |
| Max | Max | Max |
|-------|-------|------|
0 | 28.68 | 18.42 | 1.37 |
1 | 29.50 | 17.31 | 1.47 |
2 | 29.87 | 20.45 | 1.39 |
预期结果:
| A | B | C |
| Result | Result | Result |
|---------------------|-----------------------|----------------------|
0 | [True, True, False] | [True, True, False] | [True, True, True] |
1 | [True, True, True] | [True, False, False] | [True, False, False] |
2 | [True, True, True] | [False, False, False] | [True, True, False] |
我想以这种方式进行元素比较:
min <= each element in ndarray <= max
即
for row 0:
26.47 <= [27.58,28.37,28.73] <= 28.68
17.31 <= [17.31, 18.42, 18.72] <= 18.42
1.26 <= [1.36, 1.28, 1.27] <= 1.37
等等
我试过( datafram2 >= dataframe3 ) & ( datafram2 <= datafram3 ),但没用。
计算结果最简单和最快的方法是什么?
示例数据框代码:
min_columns = pd.MultiIndex.from_product( [ [ 'A', 'B', 'C' ], [ 'Min' ] ] )
val_columns = pd.MultiIndex.from_product( [ [ 'A', 'B', 'C' ], [ 'Val' ] ] )
max_columns = pd.MultiIndex.from_product( [ [ 'A', 'B', 'C' ], [ 'Max' ] ] )
min_df = pd.DataFrame( [ [ 26.47, 17.31, 1.26 ], [ 27.23, 14.38, 1.36 ], [ 27.23, 18.88, 1.28 ] ], columns=min_columns )
val_df = pd.DataFrame( [ [ [ 27.58, 28.37, 28.73 ], [ 17.31, 18.42, 18.72], [1.36, 1.28, 1.27 ] ] ] , columns=val_columns )
max_df = pd.DataFrame( [ [ 28.68, 18.42, 1.37 ], [ 29.50, 17.31, 1.47 ], [ 29.87, 20.45, 1.39 ] ] , columns=max_columns )
【问题讨论】:
-
请贴出本例中用于生成数据帧的代码。
-
旁注:在数据框中保存列表/数组通常是不好的做法。这会阻止使用 pandas api 的完整表达式,产生性能不佳的操作,并且通常会使事情变得更复杂。
-
@anon01 因为我想将列表中的每个元素与不同的最大值和最小值组合进行比较,所以我必须将要比较的元素分组到列表中,并将不同的最小值和最大值分开数据框。我是 python 的新手,不确定是否有有效的验证方式来实现这一点,尽管我知道
apply函数性能不太好。
标签: python pandas dataframe numpy