修改 Pandas 数据帧

Modifying Pandas Dataframes

提问人:Kyle_J 提问时间:11/20/2022 最后编辑:Kyle_J 更新时间:11/20/2022 访问量:23

问:

尝试创建函数 X(df): 根据以下条件替换数据帧的 FIRST 列的值:

  1. 如果该值是介于 0 和 0.5 之间的数字(因此 0 <= 值 <= 0.5), 将此值替换为此行中所有列的值之和。
  2. 如果该值介于 1.0 和 2.0 之间(因此 1.0 <= 值 <= 2.0),请将 此值为 -99。 (如果在第 1 部分中,原始值为 0.1,并且所有列(在该行中)的总和为 1.5,则此值 然后在第 2 部分中被 -99 替换。
original df:
|idx|   |A|      |B|             
|0|     |0.4|   1.0
|1|     |0.0|    0.5
|2|     |10.0|   0.0
|3|     |1.5|    -100.0
|4|     |0.1|    0.1
|5|     |0.5|    -10.0


I have this so far:

def X(df):
   for i in df.iloc[:, 0]:
       if (i >= 0) and (i <= 0.5):
           df.iloc[:,0] = df.sum(axis=1)
       elif (i>=1) and (i<=2):
           df.iloc[:,0] = int(-99)
       else:
           continue

   return df


'''
I got: 

     A      B
idx              
0      3.4    1.0
1      1.5    0.5
2     10.0    0.0
3   -298.5 -100.0
4      0.4    0.1
5    -29.5  -10.0


I was expecting:
 A      B
idx             
0     0.5    1.0
1     0.5    0.5
2    10.0    0.0
3     -99 -100.0
4     0.2    0.1
5     -9.5  -10.0
pandas 数据帧 嵌套循环布尔 逻辑

评论

0赞 CharlieBONS 11/20/2022
看看DF.Where pandas.pydata.org/pandas-docs/stable/reference/api/...
0赞 Panda Kim 11/20/2022
也许 A(idx 0) 值是 1.4,您期望 dataframem,而不是 0.5

答:

0赞 Panda Kim 11/20/2022 #1

data = {'A': {0: 0.4, 1: 0.0, 2: 10.0, 3: 1.5, 4: 0.1, 5: 0.5},
        'B': {0: 1.0, 1: 0.5, 2: 0.0, 3: -100.0, 4: 0.1, 5: -10.0}}
df = pd.DataFrame(data)

输出():df

    A    B
0   0.4  1.0
1   0.0  0.5
2   10.0 0.0
3   1.5  -100.0
4   0.1  0.1
5   0.5 -10.0



法典

np.select

import numpy as np
cond1 = (df['A'] >= 0) & (df['A'] <= 0.5)
cond2 = (df['A'] >= 1) & (df['A'] <= 2)
np.select([cond1, cond2], [df.sum(axis=1), -99], df['A'])

结果:

array([  1.4,   0.5,  10. , -99. ,   0.2,  -9.5])



最后

将结果转换为A列

df.assign(A=np.select([cond1, cond2], [df.sum(axis=1), -99], df['A']))

期望输出:

    A     B
0   1.4   1.0
1   0.5   0.5
2   10.0  0.0
3   -99.0 -100.0
4   0.2   0.1
5   -9.5  -10.0

评论

0赞 Kyle_J 11/20/2022
这很好,但是如果我使用 iloc 而不是 df[A],我将如何更改 assign 函数?
0赞 Panda Kim 11/20/2022
没关系。pandas.pydata.org/docs/reference/api/......
0赞 Kyle_J 11/20/2022 #2
    for idx, i in df.iterrows():

    if i[0] >= 1.0 and i[0] <= 2.0:
        i[0] = -99

    elif i[0] >= 0 and i[0] <= 0.5:

        if sum(i) >= 1.0 and sum(i) <= 2.0:
            i[0] = -99

        else:
            i[0] = sum(i)
return df