繁体   English   中英

如何根据另一列中的数据填充 dataframe 中的列并在 python 中的另一列上进行条件/切换

[英]How to populate a column in a dataframe based on data in another column and condition /switch on another column in python

所以我有一个 dataframe,它是通过阅读 csv 创建的。 它具有以下列: csv 中的列 现在我需要填充 vol 列。 已经计算了不同树种的体积。 如果物种是金合欢,逻辑是这样的,“dbh”(胸高直径)列中的直径是 15,体积是 15.9,以此类推其他物种。 我已经尝试过 if else 语句,但这会引发错误,即值不明确。 然后我尝试了这个

import pandas
data = pandas.read_csv("location in my pc")
df = pandas.DataFrame(data)
wdf = pandas.DataFrame(df[["site", "avkmrd", "sno", "specie", "dbh", "vol", "remarks"]])
wdf["dbh"] = (wdf["dbh"] / 2.54).__round__(0) #convert cm to inches
#key is diameter, value is volume(timber)
acaciavt = {3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 2.96, 9: 4.48, 10: 6.27, 11: 8.35, 12: 10.7, 13: 13.1, 14: 16.1, 15: 18.9,16: 22.6, 17: 26, 18: 29, 19: 32.9, 20: 36.3, 21: 40.6, 22: 44.2, 23: 48, 24: 53, 25: 57, 26: 61.1, 27: 66.7, 28: 71.1, 29: 75.5, 30: 80} 
    
    
wdf['vol'] = wdf.loc[wdf['specie'] == 'acacia', wdf["dbh"].map(acaciavt)]

返回错误

error:  raise KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of [Float64Index([51.1, 39.6, 51.1, 34.5,  0.0, 29.8, 34.5, 14.1, 45.1, 21.1,\n              ...\n              17.7, 21.1, 34.5, 39.6,  nan, 17.7, 21.1, 17.7, 17.7,  0.0],\n             dtype='float64', length=1092)] are in the [columns]"

请注意,正如您在我上传的图片中看到的那样,有不同的物种,然后有随机的 dbh,它们的体积取决于物种和 dbh。 我将衷心感谢您的帮助。

假设您对每个物种都有不同的字典,则您必须为每个物种执行类似于以下的操作:

wdf["vol"] = wdf[wdf["specie"]=="acacia"]["dbh"].apply(lambda x: acaciavt[int(x)] if not pd.isnull(x) else None)

让我一点一点地打破代码并解释发生了什么:

  1. 过滤 dataframe 以获取“specie”为“acacia”的行:
wdf[wdf["specie"]=="acacia"]` 
  1. Select 仅来自上面的dbh列:
wdf[wdf["specie"]=="acacia"]["dbh"]
  1. 对于这个过滤后的 dataframe 的每个值,即,对于每个dbh值,我们apply一个 function 从acaciavt字典返回dbh的值。 由于该值可能是float ,我们首先将其转换为int
.apply(lamba x: acaciavt[int(x)])

顺便说一句,您可以通过使用以下代码而不是前几行来使您的代码更“整洁”:

import pandas as pd
data = pd.read_csv("location in my pc")
df = pd.DataFrame(data)
wdf = df[["site", "avkmrd", "sno", "specie", "dbh", "vol", "remarks"]]
wdf["dbh"] = (wdf["dbh"]/2.54).round(0)

暂无
暂无

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

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