根据Pandas中另一列的值向新列添加值

iqjalb3h  于 2022-12-02  发布在  其他
关注(0)|答案(3)|浏览(167)

我有一个 Dataframe ,例如

Names Values 
A     0.20
A     1.30
A     1.2
B     0.30
B     0.40
C     1.2
D     0.70
E     0.12
E     1.3
F     0.90
F     0.78
F     0.88

而我想给一个New_col加一个数:

  • 1,其中对于每个Names,至少有一个Values > 0.75一个Values < 0.75
  • 对于每个Names0仅具有Values > 0.75
  • 每个Names2仅具有Values < 0.75

然后我应该得到:

Names Values New_col
A     0.20   1
A     1.30   1
A     1.2    1
B     0.30   2
B     0.40   2
C     1.2    0
D     0.70   2
E     0.12   1
E     1.3    1
F     0.90   2
F     0.78   2
F     0.88   2
sulc1iza

sulc1iza1#

首先按条件测试比较阈值0.75,如果匹配至少一个值,则获取名称,再次比较Names的成员资格,最后传递到numpy.select

m = df.Values > 0.75

s1 = df.loc[m, 'Names'].unique()
s2 = df.loc[~m, 'Names'].unique()

m1 = df['Names'].isin(s1)
m2 = df['Names'].isin(s2)

df['New_col'] = np.select([m1 & ~m2, ~m1 & m2], [0, 2], default=1)
print (df)
   Names  Values  New_col
0      A    0.20        1
1      A    1.30        1
2      A    1.20        1
3      B    0.30        2
4      B    0.40        2
5      C    1.20        0
6      D    0.70        2
7      E    0.12        1
8      E    1.30        1
9      F    0.90        0
10     F    0.78        0
11     F    0.88        0

如果每个名称仅需要0.75值的另一个输出,请用途:
第一次

e5njpo68

e5njpo682#

df = pd.DataFrame({"Names":['A','A','A','B','B','C','D','E','E','F','F','F'], "Values":[0.20,1.30,1.2,0.30,0.40,1.2,0.70,0.12,1.3,0.90,0.78,0.88]})

df["New_col"] = None
for val in set(df.Names):
    flags = [True if x>0.75 else False for x in df[df['Names']==val].Values ]
    
    if sum(flags)==0: 
        df.loc[ df['Names']==val, "New_col"] = 2
        
    elif sum(flags)==len(df[df['Names']==val]): 
        df.loc[ df['Names']==val, "New_col"] = 0
        
    else:
        df.loc[ df['Names']==val, "New_col"] = 1

输出量:

Names   Values  New_col
0   A   0.20    1
1   A   1.30    1
2   A   1.20    1
3   B   0.30    2
4   B   0.40    2
5   C   1.20    0
6   D   0.70    2
7   E   0.12    1
8   E   1.30    1
9   F   0.90    0
10  F   0.78    0
11  F   0.88    0

关于您的问题,“F”Nnames列的值应为0而不是2

1mrurvl1

1mrurvl13#

我有点晚了,但你可以使用groupby方法:

df = df.merge(df.groupby(by="Names").apply(lambda x: 0 if all(x['Values']>0.75) else (2 if all(x['Values']<0.75) else 1)).reset_index())

以下是完整代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({ 'Names': ['A', 'A', 'A', 'B', 'B', 'C', 'D', 'E', 'E', 'F', 'F', 'F'],
                    'Values': [0.2, 1.3, 1.2, 0.3, 0.4, 1.2, 0.7, 0.12, 1.3, 0.9, 0.78, 0.88]})

df = df.merge(df.groupby(by="Names").apply(lambda x: 0 if all(x['Values']>0.75) else (2 if all(x['Values']<0.75) else 1)).reset_index())
df.columns = ['Names', 'Values', 'New_col']

print(df)

输出:

Names  Values  New_col
0      A    0.20        1
1      A    1.30        1
2      A    1.20        1
3      B    0.30        2
4      B    0.40        2
5      C    1.20        0
6      D    0.70        2
7      E    0.12        1
8      E    1.30        1
9      F    0.90        0
10     F    0.78        0
11     F    0.88        0

相关问题