
[英]Why does pandas give NaN for column values when aggregating a column that doesn't exist?
[英]Create column based on row data when column doesn't exist or column is NaN in pandas
我有一个来自 OSM 数据的 dataframe。 在这里,除了我所在区域的colour
列之外,我什么都得到了。 但是在其他区域可能存在该列。 现在我想通过提供计算的 colors 来创建列(如果它丢失了),并且还想在列存在但行还没有颜色值时用颜色代码替换任何 NaN 值。
TLDR:如果需要,我如何创建一个列,否则如何创建 map NaN?
我已经尝试过这样做:
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
但是虽然它适用于空列,但它不适用于列已经部分存在的情况。 所以我想知道是否有更好的方法。
目前还不完全清楚你想要什么,但也许这很接近。
给定df1
和df2
:
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)
控制台 output:
df1:
Col_01
0 x
1 y
2 z
df2:
Col_01 colour
0 x #D30000
1 y #C21807
2 z
对您的 function 稍作更改(删除参数)并循环遍历所有数据帧:
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)
控制台 output:
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()
为空行创建一个十六进制代码,否则保留十六进制代码(如果存在)。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.