numpy 当列不存在或列为Pandas中的NaN时,根据行数据创建列

vshtjzan  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个来自OSM数据的 Dataframe 。在这个 Dataframe 中,除了我所在区域的colour列之外,我得到了所有内容。但是,在其他区域,该列可能存在。现在,如果该列缺失,我想通过提供计算的颜色来创建该列。如果该列存在,但某行还没有颜色值,我还想用颜色代码替换任何NaN值。
TLDR:如果需要,我如何创建一个列,否则MapNaN?
我已经试过了:

import random
def setColor(_):
    r = lambda: random.randint(0,255)
    return '#%02X%02X%02X' % (r(),r(),r())


lines.loc[lines['colour'].isnull(),'colour'] = lines["colour"].map(setColor)

然而,如果颜色最初不存在,则此操作失败。
我可以先运行lines["colour"] = np.nan,但是这对空列有效,但对列已经部分存在的情况不起作用,所以我想知道是否有更好的方法。

vh0rcniy

vh0rcniy1#

我不太清楚你到底想要什么,但也许已经很接近了。
给定df1df2

import pandas as pd
import numpy as np
import random

df1 = pd.DataFrame({'Col_01': ['x', 'y', 'z']})
df2 = pd.DataFrame({'Col_01': ['x', 'y', 'z'], 'colour': ['#D30000', '#C21807', '']})

print("df1:\n", df1)
print("df2:\n", df2)

控制台输出:

df1:
   Col_01
0      x
1      y
2      z
df2:
   Col_01   colour
0      x  #D30000
1      y  #C21807
2      z

对您的函数进行轻微更改(删除参数)并循环所有 Dataframe :

def setColor(): # change: remove the "_" here
    r = lambda: random.randint(0, 255)
    return '#%02X%02X%02X' % (r(),r(),r())

for df in [df1, df2]:
    if "colour" not in df:
        df["colour"] = df.apply(lambda x: setColor(), axis=1)
    else:
        df["colour"] = np.where(df["colour"] == '', setColor(), df["colour"])

print("df1:\n", df1)
print("df2:\n", df2)

控制台输出:

df1:
   Col_01   colour
0      x  #C0ACB3
1      y  #1FA09E
2      z  #4A35FF
df2:
   Col_01   colour
0      x  #D30000
1      y  #C21807
2      z  #D97652

这可能是不言自明的,但是循环首先查看colour列是否存在;否则,如果列存在,则使用np.where()为空行创建十六进制代码,否则保留十六进制代码。

相关问题