熊猫:根据更复杂的标准选择和修改数据框

时间:2018-05-30 13:05:13

标签: python pandas

我在查看thisthis个帖子,虽然我的问题并没有那么不同,但它有一些不同之处。我的数据框已满page { background: #fff; display: block; margin: 0 auto; margin-bottom: 0.5cm; box-shadow: 0 0 0.5cm rgba(0, 0, 0, 0.5); position: relative; } page[size="A4"] { width: 21cm; min-height: 29.7cm; } page[size="A4"][layout="portrait"] { width: 29.7cm; min-height: 21cm; } @media print { body { visibility: hidden; } page[size="A4"]>* { visibility: visible; } } .col-md-3 img { height: 100%; width: 100%; } ,我想用字符串替换。说:

floats

对于这个表我想用几个标准替换,但只有第一个替换工作:

      A     B       C
 A    0     1.5     13
 B    0.5   100.2   7.3
 C    1.3   34      0.01

如果我改为根据df[df<1]='N' # Works df[(df>1)&(df<10)]#='L' # Doesn't work df[(df>10)&(df<50)]='M' # Doesn't work df[df>50]='H' # Doesn't work 选择第二行,仍然无法正常工作:

float

我想知道如何在这里或任何其他方式应用((df.applymap(type)==float) & (df<10) & (df>1)) #Doesn't work 。我该怎么解决这个问题?

或者,我知道我可以逐列阅读并在每个系列中应用替换,但这似乎有点适得其反

编辑:有人可以解释为什么上面的4个简单作业不起作用吗?

3 个答案:

答案 0 :(得分:12)

numpy.selectDataFrame构造函数一起使用:

m1 = df < 1
m2 = (df>1)&(df<10)
m3 = (df>10)&(df<50)
m4 = df>5

vals = list('NLMH')

df = pd.DataFrame(np.select([m1,m2,m3,m4], vals), index=df.index, columns=df.columns)
print (df)
   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N

答案 1 :(得分:7)

使用pd.cut

pd.cut(df.stack(),[-1,1,10,50,np.inf],labels=list('NLMH')).unstack()
Out[309]: 
   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N

答案 2 :(得分:6)

您可以使用 searchsorted

&#xA;&#xA;

复制

&#xA;&#xA;
  labels = np.array(list('NLMH') )&#xA; breaks = np.array([1,10,50])&#xA; pd.DataFrame(&#xA; labels [breaks.searchsorted(df.values)]。reshape(df.shape), &#xA; df.index,df.columns)&#xA;&#xA; AB C&#xA; ANL M&#xA; BNH L&#xA; CLM N&#xA;  
&#xA;&#xA;
&#xA;&#xA;

到位

&#xA;&#xA;
  labels = np.array(list('NLMH'))&#xA; breaks = np.array([1,10,50] )&#xA; df [:] =标签[breaks.searchsorted(df.values)]。reshape(df.shape)&#xA; df&#xA;&#xA; AB C&#xA; ANL M&#xA; BNH L&#xA; CLM N&#xA;  
&#xA;&#xA;
&#xA;&#xA;

链式纯pandas方法使用 pandas.DataFrame.mask

&#xA;&#xA;

自版本0.21后弃用

&#xA;&#xA;
  df.mask(df.lt(1),'N')。mask(df.gt(1)&amp; df.lt(10),'L')\&#xA; .mask(df.gt(10)&amp; df.lt(50),'M')。mask(df.gt(50),'H')&#xA;&#xA; A B C&#xA; A N L M&#xA; B N H L&#xA; C L M N&#xA;  
&#xA;