简体   繁体   English

Python Pandas Dataframe 用列表中的值替换 NaN

[英]Python Pandas Dataframe Replace NaN with values from list

I'm trying to replace my column with NaN我正在尝试用 NaN 替换我的列

group_choices = ['Group1', 'Group2', 'Group3']

Groups limit
1 NaN NaN
2 Group1 2
3 Group2 2
4 Group3 2
5 NaN NaN
6 NaN NaN
7 NaN NaN

How can I replace NaN, randomly based on the group_choises?如何根据 group_choises 随机替换 NaN?

I'm also trying to limit how often a group_choise can be randomised selected because of the limit value in the limit column.由于限制列中的限制值,我还试图限制可以随机选择 group_choise 的频率。

I'm trying to get this result:我试图得到这个结果:

Groups limit
1 Group3 NaN
2 Group1 2
3 Group2 2
4 Group3 2
5 Group1 NaN
6 Group2 NaN
7 Out of groups

fillna with dictionaries用字典fillna

dct = dict(zip(df.Groups.loc[pd.isna].index, group_choices))

df.fillna({'Groups': dct}).fillna({'Groups': 'Out of groups'})

          Groups  limit
1         Group1    NaN
2         Group1    2.0
3         Group2    2.0
4         Group3    2.0
5         Group2    NaN
6         Group3    NaN
7  Out of groups    NaN

Old Answers旧答案

Useful but I like the new one better.有用,但我更喜欢新的。 It illustrates the evolution of my thought process.它说明了我的思维过程的演变。

Generators发电机

def get_some(i, n):
  for x in [*i] * n:
    yield x

def fill(s, i, n):
  gs = get_some(i, n)
  for x in s:
    if pd.isnull(x):
      try:
        yield next(gs)
      except StopIteration:
        yield "Out of groups"
    else:
      yield x

df.assign(Groups=[*fill(df.Groups, group_choices, 1)])

          Groups  limit
1         Group1    NaN
2         Group1    2.0
3         Group2    2.0
4         Group3    2.0
5         Group2    NaN
6         Group3    NaN
7  Out of groups    NaN

Alternative选择

def get_some(i, n):
  for x in [*i] * n:
    yield x

df.assign(Groups=df.Groups.fillna(
    df.Groups.loc[pd.isna].pipe(
        lambda s: pd.Series(dict(zip(s.index, get_some(group_choices, 1))))
    )
).fillna('Out of groups'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM