我有以下数据框:
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,...?
答案 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)
还可以将groupby
和subtract
与cumulative 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