当df仅1行时,使用np.column_stack创建数据帧

时间:2019-06-23 15:07:22

标签: python pandas numpy dataframe

我正在关注该主题和接受的答案:Best way to join / merge by range in pandas

我正在基于几个准则和2 df之间的范围值,在多个数据帧上动态应用相同的逻辑以加入2 df

A = pd.DataFrame(dict(
        A_id=range(10),
        A_value=range(5, 105, 10)
    ))
B = pd.DataFrame(dict(
        B_id=range(5),
        B_low=[0, 30, 30, 46, 84],
        B_high=[10, 40, 50, 54, 84]
    ))

A

   A_id  A_value
0     0        5
1     1       15
2     2       25
3     3       35
4     4       45
5     5       55
6     6       65
7     7       75
8     8       85
9     9       95

B

   B_high  B_id  B_low
0      10     0      0
1      40     1     30
2      50     2     30
3      54     3     46
4      84     4     84

a = A.A_value.values
bh = B.B_high.values
bl = B.B_low.values

i, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh))

pd.DataFrame(
    np.column_stack([A.values[i], B.values[j]]),
    columns=A.columns.append(B.columns)

现在,有时我的A df只有一行,并且我需要将A df中的行添加到B df的有效行中。我没有合并它们的条件,因为我的A df的所有行(即1)在2 df之间都匹配。

我无法使用与线程中相同的逻辑来创建输出df。

如何合并1行的df与仅满足我np中的条件的行以及其他df所在的行合并?

一个简化的例子,我有:

A = pd.DataFrame(dict(
        A_id=[0],
        A_value=123
    ))
B = pd.DataFrame(dict(
        B_id=range(5),
        B_low=[0, 30, 30, 46, 84],
        B_high=[10, 40, 50, 54, 84]
    ))

A

   A_id  A_value
0     0        123

B

   B_high  B_id  B_low
0      10     0      0
1      40     1     30
2      50     2     30
3      54     3     46
4      84     4     84

i = np.where(B['B_low'].values == 30)

我会给我一个数组,其中B中的行B_low等于30

现在我有了有效的行,我试图按照相同的逻辑来执行此操作,但无济于事:

pd.DataFrame(np.column_stack([A.values[i], B.values),
        columns=A.columns.append(B.columns))

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我已经用另一种方式完成了,在我的B df中添加一列A_value并将值@ A.at[0;A_Value]

有兴趣了解如何遵循与上述主题相同的逻辑来完成