簡體   English   中英

pandas中列不存在或列為NaN時根據行數據創建列

[英]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但是雖然它適用於空列,但它不適用於列已經部分存在的情況。 所以我想知道是否有更好的方法。

目前還不完全清楚你想要什么,但也許這很接近。

給定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)

控制台 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM