如何根据条件从另一个 Dataframe 创建新列

um6iljoc  于 2022-10-22  发布在  Python
关注(0)|答案(2)|浏览(196)

我正在尝试连接两个数据集,但它们不相同或具有相同的标准。
目前我有下面的数据集,其中包含了基于月份和年份的火灾数量,但月份是标题的一部分,年份是一列。


小时
我想将此数据作为另一个数据集的目标data_mediao列添加到一个新列中(假设称为nr_total_queimadas)。


小时
日期格式是YYYY-MM-DD,但在这里日期并不重要。
我试着对这个案子做一个循环,但我认为我做错了什么,我不知道该如何处理这个案子。
下面是一个示例,说明我希望输出与两个数据集的连接:


小时
我举了一个例子,一些日期重复(应该发生),因此包含火灾次数的数据集中的数字也应该重复。

pu82cl6c

pu82cl6c1#

首先,我假设第一个 Dataframe 在变量a中,第二个 Dataframe 位于变量m1n 1o1p。
为了简化查找,我们将a的索引设置为year:

a = a.set_index('year')

然后,我们取 Dataframe bdata_medicao的年份:

years = b['medicao'].dt.year

为了从 Dataframe b中获取月份名称,我们使用strftime。然后,我们需要将月份名称改为小写,以便与a中的列名匹配。为此,我们使用.str.lower()

month_name_lowercase = b['medicao'].dt.strftime("%B").str.lower()

然后使用lookup,我们可以使用索引yearsmonth_name_lowercase列出 Dataframe a中的所有值:

num_fires = a.lookup(years.values, month_name_lowercase.values)

最后,将新值添加到b中的新列中:

b['nr_total_quimadas'] = num_fires

所以完整的代码如下:

a = a.set_index('year')

years = b['medicao'].dt.year
month_name_lowercase = b['medicao'].dt.strftime("%B").str.lower()

num_fires = a.lookup(years.values, month_name_lowercase.values)

b['nr_total_queimadas'] = num_fires
vuktfyat

vuktfyat2#

假设年与月的数据如下。将月份名称转换为数字:

columns = ["year","jan","feb","mar"]
data = [
    (2001,110,120,130),
    (2002,210,220,230),
    (2003,310,320,330)
    ]

df = pd.DataFrame(data=data, columns=columns)
month_map = {"jan":"1", "feb":"2", "mar":"3"}
df = df.rename(columns=month_map)

[Out]:
   year    1    2    3
0  2001  110  120  130
1  2002  210  220  230
2  2003  310  320  330

假设以下数据用于日期事务。从日期提取年份和月份:

columns2 = ["date"]
data2 = [
    ("2001-02-15"),
    ("2001-03-15"),
    ("2002-01-15"),
    ("2002-03-15"),
    ("2003-01-15"),
    ("2003-02-15"),
    ]

df2 = pd.DataFrame(data=data2, columns=columns2)
df2["date"] = pd.to_datetime(df2["date"])
df2["year"] = df2["date"].dt.year
df2["month"] = df2["date"].dt.month

[Out]:
        date  year  month
0 2001-02-15  2001      2
1 2001-03-15  2001      3
2 2002-01-15  2002      1
3 2002-03-15  2002      3
4 2003-01-15  2003      1
5 2003-02-15  2003      2

加入日期:

df2 = df2.merge(df, left_on="year", right_on="year", how="left")

[Out]:
        date  year  month    1    2    3
0 2001-02-15  2001      2  110  120  130
1 2001-03-15  2001      3  110  120  130
2 2002-01-15  2002      1  210  220  230
3 2002-03-15  2002      3  210  220  230
4 2003-01-15  2003      1  310  320  330
5 2003-02-15  2003      2  310  320  330

计算逐行月份总和:

df2["nr_total_queimadas"] = df2[list(month_map.values())].apply(pd.Series.sum, axis=1)
df2[["date", "nr_total_queimadas"]]

[Out]:
        date  nr_total_queimadas
0 2001-02-15                 360
1 2001-03-15                 360
2 2002-01-15                 660
3 2002-03-15                 660
4 2003-01-15                 960
5 2003-02-15                 960

相关问题