[英]Pandas: Create new column and add value depending on value (substring) in a string column and value on another column
[英]Add value to new column depending on values in another in pandas
我有一个 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
0
对于每个只有Values > 0.75
的Names
2
对于每个只有Values < 0.75
的Names
然后我应该得到:
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
首先按比较阈值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
个值的另一个输出,请使用:
print (df)
Names Values
0 A 0.20
1 A 1.30
2 A 1.20
3 B 0.30
4 B 0.40
5 C 1.20
6 D 0.70
7 E 0.12
8 E 1.30
9 F 0.90
10 F 0.78
11 F 0.88
12 G 0.75
13 G 0.75
m1 = df.Values > 0.75
m2 = df.Values < 0.75
s1 = df.loc[m1, 'Names'].unique()
s2 = df.loc[m2, 'Names'].unique()
m1 = df['Names'].isin(s1)
m2 = df['Names'].isin(s2)
df['New_col'] = np.select([m1 & ~m2, ~m1 & m2, m1 & m2],
[0, 2, 1], default=None)
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
12 G 0.75 None
13 G 0.75 None
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
Output:
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
聚会有点晚了,但你可以使用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)
OUTPUT:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.