2

我想根据下面列出的多个条件将值从一列(个人信息)复制到另一列(变量)

  1. 检查“个人信息”列是否以数字开头

  2. 检查'VARIABLE'列中对应的行值是否为Nan

  3. 检查'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,则必须复制数据

4

1 回答 1

2

我相信您需要Series.str.containswith^作为字符串的开头和\d数字,然后通过测试不包含带有Series.cumsumGroupBy.transform的数字的值来创建组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
于 2019-05-29T06:04:32.750 回答