生成负数序列

时间:2019-12-17 12:45:56

标签: python pandas

我有以下数据框:

    userId  firstName   lastName        gender          level
61  -1  Not Provided    Not Provided    Not Provided    paid
100 -1  Not Provided    Not Provided    Not Provided    free

两个userId都是-1,因为我执行了代码user_df['userId'] = user_df['userId'].replace(r'^\s*$', '-1', regex=True)

是否可以设置连续的负数,如-1,-2,...?

5 个答案:

答案 0 :(得分:4)

如果只想替换空字符串,请使用Series.str.contains作为此值的掩码,然后在布尔掩码中添加长度为True s的数组:

user_df = pd.DataFrame({'userId':['','','qq','']})

m = user_df['userId'].str.contains(r'^\s*$')

user_df.loc[m, 'userId'] = -pd.np.arange(1, m.sum() + 1)
print (user_df)
.  userId
0     -1
1     -2
2     qq
3     -3

详细信息

user_df.loc[m, 'userId'] = -pd.np.arange(1, m.sum() + 1)
print (m)
0     True
1     True
2    False
3     True
Name: userId, dtype: bool

print (m.sum())
3

print (-pd.np.arange(1, m.sum() + 1))
[-1 -2 -3]

这里也可以导入numpy,这对于熊猫是必需的:

import numpy as np

m = user_df['userId'].str.contains(r'^\s*$')

user_df.loc[m, 'userId'] = -np.arange(1, m.sum() + 1)

答案 1 :(得分:3)

您可以使用Base函数设置负序索引号。

range

结果:

df = pd.DataFrame({'userId': [-1, -1]}, index=[61, 100])
df.index = range(-1, -df.shape[0]-1 , -1)

答案 2 :(得分:2)

尝试:

user_df['userId'] = (df.index + 1) * -1

答案 3 :(得分:2)

使用groupby.cumsum的另一种解决方案:

user_df['userId'] = (user_df['userId'].replace(r'^\s*$', -1, regex=True)
                     .groupby(user_df['userId']).cumsum())

答案 4 :(得分:2)

还可以将groupbysubtractcumulative count一起使用,我假设您的userId已设置为-1

df['userId'] = df['userId'].sub(df.groupby(['userId']).cumcount())
print(df)
       userId       firstName          lastName            gender     level
61       -1    Not Provided      Not Provided      Not Provided      paid
100      -2   Not Provided       Not Provided      Not Provided      free