【问题标题】:How do I make separate columns from one column that contains null and multiple values?如何从包含空值和多个值的一列中创建单独的列?
【发布时间】:2019-10-18 10:02:03
【问题描述】:

我已将此文件从 PDF 转换为 CSV 以训练模型。 pdf 文件中的三列在 csv 中合并为一列,例如 ProductID、商品和国家/地区。

我试图在正则表达式的帮助下分隔这些列,但我不太确定这些列将如何处理。

这组数据就是我要处理的:

                   country/commodity Unit        Quantity      Value
1     0011101 BREEDING BULLS (OXEN)   NO            NaN          75
2                             DUBAI  NaN            NaN          75
3  0011102 BREEDING BULLS (BUFFALO)   NO            248        1921
4                         SRI LUNKA  NaN            248        1921
5          0011103 BUFFALO,BREEDING   NO            NaN          90
6                         SRI LUNKA  NaN            NaN          90
7             0011104 COWS BREEDING   NO           1249   258921665
8                             AJMAN  NaN            NaN         NaN
9                            CYPRUS  NaN            NaN         NaN 

我需要这些数据采用这种格式:

0    ProductID      Commodity           Country     Unit  Quantity    Value 
1     0011101    BREEDING BULLS (OXEN)   DUBAI      NaN    NaN          75
3     0011102   BREEDING BULLS (BUFFALO) SRI LUNKA  NaN    248         1921
4     0011103   BUFFALO,BREEDING         SRI LUNKA  NaN    NaN          90            
7     0011104   COWS BREEDING            AJMAN      NaN    NaN         NaN        
8     0011104   COWS BREEDING            CYPRUS     NaN    NaN         NaN                        
9     0011104   COWS BREEDING            CHINA      NaN    590         3290

【问题讨论】:

  • 第 9 行是从哪里来的?
  • 无法弄清楚为什么数字不一致。但总体思路是用产品 ID(使用正则表达式)识别行,将 ID 和商品分开并填充 ProductID 和 Commidity 列
  • @Erfan Oh 第一个中缺少的。忽略它。
  • @MarkWang 如您所见,我需要带有国家/地区的 ProductID 和 Commodity,因此不需要总和“数字不一致”。如果您能想办法将第一列更改为三列(在第二部分中),那就太好了。
  • @Idris,那么我在 cmets 中提到的应该可以工作。

标签: pandas dataframe python-3.7


【解决方案1】:

首先,我们将country/commodity 列中的信息减去:

  • str.split
  • str.extract
  • Series.where
  • Series.mask
  • str.contains

然后我们GroupByProductID一起获取相应产品的信息,我们使用named aggregation,这是pandas 0.25.0之后的新功能:

# Extract information from country/commodity
df['ProductID'] = df['country/commodity'].str.split(' ', 1).str[0].str.extract('(\d+)').ffill()
df['Commodity'] = df['country/commodity'].str.split('\d+').str[-1].where(df['Unit'].notna())
df['Country'] = df['country/commodity'].mask(df['country/commodity'].str.contains('\d+')).fillna('')

# Groupby ProductID to get information together
df_new = df.groupby(['ProductID']).agg(
    Commodity=('Commodity', 'first'),
    Country=('Country', ', '.join),
    Unit=('Unit', 'first'),
    Quantity=('Quantity', 'first'),
    Value=('Value', 'first')
).reset_index()

# Remove unnecessary comma's
df_new['Country'] = df_new['Country'].str.lstrip(', ')

输出

  ProductID                  Commodity        Country Unit  Quantity  \
0   0011101      BREEDING BULLS (OXEN)          DUBAI   NO       NaN   
1   0011102   BREEDING BULLS (BUFFALO)      SRI LUNKA   NO     248.0   
2   0011103           BUFFALO,BREEDING      SRI LUNKA   NO       NaN   
3   0011104              COWS BREEDING  AJMAN, CYPRUS   NO    1249.0   

         Value  
0         75.0  
1       1921.0  
2         90.0  
3  258921665.0  

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多