首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:在2列上合并

Python:在2列上合并
EN

Stack Overflow用户
提问于 2020-09-16 13:57:12
回答 2查看 1.4K关注 0票数 1

我在处理一个大数据集。下面是一个用较小的数据集计算的示例。

在这个例子中,我得到了3条河流在不同时间内污染的测量值。每年,在下游的测量站(“污染”)测量河流的污染量。它已经被计算出来,在那一年河水被上游污染("year_of_upstream_pollution")。我的目标是创建一个新的列"result_of_upstream_pollution",其中包含与"year_of_upstream_pollution“连接的污染量。为此,必须重新分配来自“污染”-column的数据。

代码语言:javascript
复制
ids = [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3]
year = [2000,2001,2002,2003,2004,2005,1990,1991,1992,1993,1994,1995,2000,2001,2002,2003,2004,2005]
y1 = [2002,2002,2003,2005,2005,np.NaN,1991,1992,1993,1994,np.NaN,np.NaN,2012,2012,2013,2014,2015,np.NaN]
poll = [10,14,20,11,8,11,
          20,22,20,25,18,21,
          30,19,15,10,26,28]

dictr1 ={"river_id":ids,"year":year,"pollution": poll,"year_of_upstream_pollution":y1}
dfr1 = pd.DataFrame(dictr1)
print(dfr1)

    river_id  year  pollution  year_of_upstream_pollution
0          1  2000         10                      2002.0
1          1  2001         14                      2002.0
2          1  2002         20                      2003.0
3          1  2003         11                      2005.0
4          1  2004          8                      2005.0
5          1  2005         11                         NaN
6          2  1990         20                      1991.0
7          2  1991         22                      1992.0
8          2  1992         20                      1993.0
9          2  1993         25                      1994.0
10         2  1994         18                         NaN
11         2  1995         21                         NaN
12         3  2000         30                      2002.0
13         3  2001         19                      2002.0
14         3  2002         15                      2003.0
15         3  2003         10                      2004.0
16         3  2004         26                      2005.0
17         3  2005         28                         NaN

示例: river_id = 1,年份=2000年,year_of_upstream_pollution =2002年

2002年污染柱的

  • 值= 20

因此,

  • :result_of_upstream_pollution = 20

生成的列应该如下所示:

代码语言:javascript
复制
    result_of_upstream_pollution  
0                           20.0  
1                           20.0  
2                           11.0  
3                           11.0  
4                           11.0  
5                            NaN  
6                           22.0  
7                           20.0  
8                           25.0  
9                           18.0  
10                           NaN  
11                           NaN  
12                          15.0  
13                          15.0  
14                          10.0  
15                          26.0  
16                          28.0  
17                           NaN  

我自己的方法:

代码语言:javascript
复制
### My approach
# Split dfr1 in two
dfr3 = pd.DataFrame(dfr1, columns = ["river_id","year","pollution"])
dfr4 = pd.DataFrame(dfr1, columns = ["river_id","year_of_upstream_pollution"])

# Merge the two dataframes on the "year" and "year_of_upstream_pollution"-column
arrayr= dfr4.merge(dfr3, left_on = "year_of_upstream_pollution", right_on = "year", how = "left").pollution.values
listr = arrayr.tolist()
dfr1["result_of_upstream_pollution"] = listr
print(dfr1)

len(listr) # = 28

这将导致以下ValueError:

  • “值的长度不匹配索引的长度”
  • 对此的解释是,"dfr3“的”年份“-column中的值并不是唯一的,这导致每年分配几个数字,并解释了原因: len(listr) = 28

我还没有找到解决这个错误的方法。请记住,真正的数据集比这个数据集大得多。任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-16 14:03:54

正如您在标题中所说的,这是在两列上合并:

代码语言:javascript
复制
dfr1['result_of_upstream_pollution'] = dfr1.merge(dfr1, left_on=['river_id','year'],
                                                  right_on=['river_id','year_of_upstream_pollution'], 
                                                  how='right')['pollution_x']
print(df)

输出:

代码语言:javascript
复制
    result_of_upstream_pollution  
0                           20.0  
1                           20.0  
2                           11.0  
3                           11.0  
4                           11.0  
5                            NaN  
6                           22.0  
7                           20.0  
8                           25.0  
9                           18.0  
10                           NaN  
11                           NaN  
12                          15.0  
13                          15.0  
14                          10.0  
15                          26.0  
16                          28.0  
17                           NaN  
票数 1
EN

Stack Overflow用户

发布于 2020-09-16 15:03:49

我刚意识到这个解决方案似乎不适合我。当我执行代码时,会发生这样的情况:

代码语言:javascript
复制
dfr1['result_of_upstream_pollution'] = dfr1.merge(dfr1, left_on=['river_id','year'],
                                                  right_on=['river_id','year_of_upstream_pollution'], 
                                                  how='right')['pollution_x']
print(dfr1)
    river_id  year  pollution  year_of_upstream_pollution  \
0          1  2000         10                      2002.0   
1          1  2001         14                      2002.0   
2          1  2002         20                      2003.0   
3          1  2003         11                      2005.0   
4          1  2004          8                      2005.0   
5          1  2005         11                         NaN   
6          2  1990         20                      1991.0   
7          2  1991         22                      1992.0   
8          2  1992         20                      1993.0   
9          2  1993         25                      1994.0   
10         2  1994         18                         NaN   
11         2  1995         21                         NaN   
12         3  2000         30                      2002.0   
13         3  2001         19                      2002.0   
14         3  2002         15                      2003.0   
15         3  2003         10                      2004.0   
16         3  2004         26                      2005.0   
17         3  2005         28                         NaN   

    result_of_upstream_pollution  
0                           20.0  
1                           20.0  
2                           11.0  
3                           11.0  
4                           11.0  
5                           22.0  
6                           20.0  
7                           25.0  
8                           18.0  
9                           15.0  
10                          15.0  
11                          10.0  
12                          26.0  
13                          28.0  
14                           NaN  
15                           NaN  
16                           NaN  
17                           NaN  

由于某些原因,这段代码似乎没有以正确的方式处理"NaN“值。

如果在"result_of_upstream_pollution".

  • Equally,中有一个"NaN"-value (在"year_of_upstream_pollution“栏中),那么在中不应该有一个值-- id 14、15和16都有”year_of_upstream_pollution“的值,后者在”污染-列“中具有匹配的数据,因此也应该在”污染-列“的result-column.
  • On顶部有值,似乎在第一个"NaN”之后的所有值(id= 5)都分配了错误的值。

@Quang Hoang非常感谢您试图解决我的问题!你能解释一下为什么我的结果和你的不同吗?

有人知道我怎样才能让这段代码正常工作吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63921651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档