mit*_*lee 5 python numpy where pandas
我有一个包含多列的数据框.
AC BC CC DC MyColumn
Run Code Online (Sandbox Code Playgroud)
一个
乙
C
d
我想设置一个新列"MyColumn",如果BC,CC和DC小于AC,则取该行的三个最大值.如果只有CC和DC小于AC,则取该行的CC和DC的最大值等.如果它们都不小于AC,MyColumn应该从AC获取值.
我怎么用numpy.where()做到这一点?
您可以使用lt方法以及where:
In [11]: df = pd.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))
In [12]: df
Out[12]:
A B C D
0 1.587878 -2.189620 0.631958 -0.432253
1 -1.636721 0.568846 -0.033618 -0.648406
2 1.567512 1.089788 0.489559 1.673372
3 0.589222 -1.176961 -1.186171 0.249795
4 0.366227 1.830107 -1.074298 -1.882093
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用列的最大子集:
In [13]: df[['B', 'C', 'D']].max(1)
Out[13]:
0 0.631958
1 0.568846
2 1.673372
3 0.249795
4 1.830107
dtype: float64
Run Code Online (Sandbox Code Playgroud)
查看每列的值,看它们是否小于A:
In [14]: lt_A = df.lt(df['A'], axis=0)
In [15]: lt_A
Out[15]:
A B C D
0 False True True True
1 False False False False
2 False True True False
3 False True True True
4 False False True True
In [15]: lt_A[['B', 'C', 'D']].all(1)
Out[15]:
0 True
1 False
2 False
3 True
4 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用以下所有内容构建所需的结果:
In [16]: df[['B', 'C', 'D']].max(1).where(lt_A[['B', 'C', 'D']].all(1), 2)
Out[16]:
0 0.631958
1 2.000000
2 2.000000
3 0.249795
4 2.000000
dtype: float64
Run Code Online (Sandbox Code Playgroud)
而不是2你可以先插入系列(在这个例子中它恰好相同):
In [17]: df[['C', 'D']].max(1).where(lt_A[['C', 'D']].all(1), 2)
Out[17]:
0 0.631958
1 2.000000
2 2.000000
3 0.249795
4 -1.074298
dtype: float64
Run Code Online (Sandbox Code Playgroud)
然后是A栏:
In [18]: df[['B', 'C', 'D']].max(1).where(lt_A[['B', 'C', 'D']].all(1), df[['C', 'D']].max(1).where(lt_A[['C', 'D']].all(1), df['A']))
Out[18]:
0 0.631958
1 -1.636721
2 1.567512
3 0.249795
4 -1.074298
dtype: float64
Run Code Online (Sandbox Code Playgroud)
显然,如果你打算重复使用,你应该把它写成函数!
我的理解是,您需要的列数最多小于第一列,如果不存在此列,则需要在第一列上进行回退; 如果是这样的话:
>>> df
A B C D
0 1.587878 -2.189620 0.631958 -0.432253
1 -1.636721 0.568846 -0.033618 -0.648406
2 1.567512 1.089788 0.489559 1.673372
3 0.589222 -1.176961 -1.186171 0.249795
4 0.366227 1.830107 -1.074298 -1.882093
[5 rows x 4 columns]
>>> df[df.lt(df.A, axis=0)].max(axis=1).fillna(df.A)
0 0.631958
1 -1.636721
2 1.089788
3 0.249795
4 -1.074298
dtype: float64
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |