Как сделать отдельные столбцы из одного столбца, который содержит нулевые и множественные значения? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть этот файл, преобразованный из PDF в CSV для обучения модели. три столбца из файла PDF слились в один в csv, например, ProductID, Commodity и country.

Я пытался разделить эти столбцы с помощью регулярного выражения, но я не совсем уверен, как столбцыЯ пойду.

С этим набором данных я имею дело:

                   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

1 Ответ

0 голосов
/ 18 октября 2019

Сначала мы создадим ваши столбцы ProductID, Commodity, Country, вычтя информацию из столбца country/commodity:

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

Затем мы GroupBy на ProductID, чтобы получить информацию о соответствующих продуктах вместе, и мыиспользуйте для этого 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  
...