检查上一行的值以将数据从一列复制到另一列

时间:2019-05-29 05:07:26

标签: python regex python-3.x pandas dataframe

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

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

  2. 检查“变量”列中对应的行值是否为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,则必须复制数据

1 个答案:

答案 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