我想根据以下列出的多个条件将一列(个人信息)中的值复制到另一列(变量)中
检查“个人信息”列是否以数字开头
检查“变量”列中对应的行值是否为Nan
检查“ VARIABLE”列中的上一行值是否不是Nan(这里的“ gender”不是nan,但有时可能是Nan)
一旦所有条件都满足,我想将“个人信息”列的值复制到“可变”列
请在下面找到输入数据的外观
df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female','Ethnicity','1.Chinese','2.Indian','3.Eurasian','Marital Status','1.Single','2.Married','3.Divorced'], 'VARIABLE':['gender', np.nan, np.nan,'ethn',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})
婚姻状况选项不应复制到“变量”列,因为上一行在此处是Nan。
我正在使用np.where选项,但是不确定如何检查上一行的值。我不想使用for循环。
df['VARIABLE'] = np.where((df['PERSONAL
INFORMATION'].str.startswith(('\d+')) == True) & (df['VARIABLE'].isna() ==
True) & 3RD CONDITION FOR PREVIOUS ROW CHECK
可以帮我看看如何检查nan的上一行值。如果是Nan,我不想复制数据。如果不是Nan,则必须复制数据
答案 0 :(得分:1)
我相信您需要Series.str.contains
,其中^
用于字符串的开头,\d
用于数字,然后通过测试不包含数字的数字来创建组,其中Series.cumsum
和{{3 }}与first
:
m1 = df['PERSONAL INFORMATION'].str.contains('^\d')
s = df.groupby((~m1).cumsum())['VARIABLE'].transform('first')
mask = m1 & df['VARIABLE'].isna() & s.notna()
df.loc[mask, 'VARIABLE'] = df.loc[mask, 'PERSONAL INFORMATION']
print (df)
PERSONAL INFORMATION VARIABLE
0 Gender gender
1 1.Male 1.Male
2 2.Female 2.Female
3 Ethnicity ethn
4 1.Chinese 1.Chinese
5 2.Indian 2.Indian
6 3.Eurasian 3.Eurasian
7 Marital Status NaN
8 1.Single NaN
9 2.Married NaN
10 3.Divorced NaN
详细信息:
print ((~m1).cumsum())
0 1
1 1
2 1
3 2
4 2
5 2
6 2
7 3
8 3
9 3
10 3
Name: PERSONAL INFORMATION, dtype: int32
print (df.groupby((~m1).cumsum())['VARIABLE'].transform('first'))
0 gender
1 gender
2 gender
3 ethn
4 ethn
5 ethn
6 ethn
7 NaN
8 NaN
9 NaN
10 NaN
Name: VARIABLE, dtype: object