首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与NAs联合

与NAs联合
EN

Stack Overflow用户
提问于 2019-01-16 13:55:40
回答 3查看 260关注 0票数 1

我有以下数据:

代码语言:javascript
复制
import pandas as pd
import numpy as np

data = pd.DataFrame({
    'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C'],
    'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'USA', 'FRA', np.NaN],
    'date': ['2018-08-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-09-01', '2018-09-01', np.NaN],
    'feature_proj': [100, 100, 100, 100, 100, 100, 106, 106, 106, 106, 106, 110],
    'feature_country': [1, 1, 1, 1, 2, 2, 3, 4, 4, 4, 5, np.NaN],
    'feature_date': [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, np.NaN]
})

我想加入:

代码语言:javascript
复制
forecastFor = pd.DataFrame({
    'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'D'],
    'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'GER', 'POL', 'USA'],
    'date': ['2018-07-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-10-01', '2018-11-01', '2018-11-01'],
    'hours': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
})

在某种程度上,我最终会得到:

代码语言:javascript
复制
expected = pd.DataFrame({
    'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
    'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'GER', 'POL'],
    'date': ['2018-07-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-10-01', '2018-11-01'],
    'hours': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    'feature_proj': [100, 100, 100, 100, 100, 100, 106, 106, 106, 110, 110],
    'feature_country': [1, 1, 1, 1, 2, 2, 3, 4, 4, np.NaN, np.NaN],
    'feature_date': [np.NaN, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, np.NaN, np.NaN]
})

因此,我有一个dataframe (data),具有不同级别的特性。有项目级功能,有项目级和国家级,也有项目级和国家级和日期级。我还有第二个dataframe (forecastFor),它包含每个项目国家日期元组(在这里命名为hours)的一些值。我想加入这两家公司,以便:

  • 结果,我有与forecastFor相同的记录,但添加了特性列。不应该有其他记录,但是如果proj列没有匹配项,则可以删除记录。
  • 联接应该是inner类型的proj列-它们应该全部匹配,所有不匹配的记录都不应该包含在结果中。
  • countrydate上的匹配应该是left类型(熊猫删除连接所在的列中带有NA的记录,但我仍然希望记录与匹配的proj,即使country是NA)。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-16 14:21:06

很抱歉,这是一件很简单的事情,在写下这个问题之后,我立刻想出了答案:

代码语言:javascript
复制
projLevelFeaturesData = data[['proj', 'feature_proj']].drop_duplicates()
countryLevelFeaturesData = data[['proj', 'country', 'feature_country']].drop_duplicates().dropna()
dateLevelFeaturesData = data[['proj', 'country', 'date', 'feature_date']].drop_duplicates().dropna()
projJoined = forecastFor.merge(projLevelFeaturesData, on=['proj'], how='inner')
countryJoined = projJoined.merge(countryLevelFeaturesData, on=['proj', 'country'], how='left')
joined = countryJoined.merge(dateLevelFeaturesData, on=['proj', 'country', 'date'], how='left')
票数 0
EN

Stack Overflow用户

发布于 2019-01-16 14:14:12

代码语言:javascript
复制
pd.merge(forecastFor, data, how='left')

让你接近..。

代码语言:javascript
复制
0   A   POL 2018-07-01  1   NaN NaN NaN
1   A   POL 2018-09-01  2   100.0   1.0 1001.0
2   A   POL 2018-10-01  3   100.0   1.0 1002.0
3   A   POL 2018-11-01  4   100.0   1.0 1003.0
4   A   USA 2018-09-01  5   100.0   2.0 1004.0
5   A   USA 2018-10-01  6   100.0   2.0 1005.0
6   B   POL 2018-06-01  7   106.0   3.0 1006.0
7   B   USA 2018-07-01  8   106.0   4.0 1007.0
8   B   USA 2018-08-01  9   106.0   4.0 1008.0
9   C   GER 2018-10-01  10  NaN NaN NaN
10  C   POL 2018-11-01  11  NaN NaN NaN
11  D   USA 2018-11-01  12  NaN NaN NaN```
票数 0
EN

Stack Overflow用户

发布于 2019-01-16 14:29:14

您只需获得forecastFor的列,其中的data中有proj,然后按如下方式加入:

代码语言:javascript
复制
forecastFor=forecastFor[forecastFor['proj'].isin(data.proj.unique())]
df=forecastFor.merge(data, on=['proj','country','date'], how='left')

输出

代码语言:javascript
复制
   proj country        date  hours  feature_proj  feature_country  \
0     A     POL  2018-07-01      1           NaN              NaN   
1     A     POL  2018-09-01      2         100.0              1.0   
2     A     POL  2018-10-01      3         100.0              1.0   
3     A     POL  2018-11-01      4         100.0              1.0   
4     A     USA  2018-09-01      5         100.0              2.0   
5     A     USA  2018-10-01      6         100.0              2.0   
6     B     POL  2018-06-01      7         106.0              3.0   
7     B     USA  2018-07-01      8         106.0              4.0   
8     B     USA  2018-08-01      9         106.0              4.0   
9     C     GER  2018-10-01     10           NaN              NaN   
10    C     POL  2018-11-01     11           NaN              NaN   

    feature_date  
0            NaN  
1         1001.0  
2         1002.0  
3         1003.0  
4         1004.0  
5         1005.0  
6         1006.0  
7         1007.0  
8         1008.0  
9            NaN  
10           NaN  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54218636

复制
相关文章

相似问题

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