Как создать pandas dataframe из первых допустимых значений другого dataframe? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть пандас данных в виде:

df

    ID    col_1    col_2    col_3
     1              20       40
     1     10                      
     1     50                60
     3     40       10       90
     4              80       80 

Я пытаюсь создать новый фрейм данных, чтобы каждая строка соответствовала уникальномуID и столбцы являются первыми действительными значениями для данного идентификатора, комбинации столбцов в исходном кадре данных

Вот что я пытаюсь построить:

new_df

    ID    first_col_1    first_col_2    first_col_3
    1         10             20             40 
    3         40             10             90 
    4                        80             80 

Я пытаюсь использовать pandas.DataFrame.first_valid_index () для этого, но не могу объединить его с функцией groupby, которая потребуется.Какой самый питонный способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я думаю, что это работает, как вы ожидаете:

import pandas as pd
import numpy as np


rows = []
rows.append({'ID': 1, 'col_1': ' ', 'col_2':'20', 'col_3': '40'})
rows.append({'ID': 1, 'col_1': '10', 'col_2': ' ', 'col_3': ' '})
rows.append({'ID': 1, 'col_1': '50', 'col_2':' ', 'col_3': '60'})
rows.append({'ID': 3, 'col_1': '40', 'col_2':'10', 'col_3': '90'})
rows.append({'ID': 4, 'col_1': ' ', 'col_2':'80', 'col_3': '80'})
df = pd.DataFrame(rows)

df = df.replace(' ', np.nan)
df = df.bfill().groupby('ID').first()
df = df.fillna(' ')
df = df.reset_index()
0 голосов
/ 07 декабря 2018

Я думаю, что заслуживаю +1 для восстановления ваших данных; D

import pandas as pd
import numpy as np

# Create DataFrame
rows = []
rows.append({'ID': 1, 'col_1': ' ', 'col_2':'20', 'col_3': '40'})
rows.append({'ID': 1, 'col_1': '10', 'col_2': ' ', 'col_3': ' '})
rows.append({'ID': 1, 'col_1': '50', 'col_2':' ', 'col_3': '60'})
rows.append({'ID': 3, 'col_1': '40', 'col_2':'10', 'col_3': '90'})
rows.append({'ID': 4, 'col_1': ' ', 'col_2':'80', 'col_3': '80'})
df = pd.DataFrame(rows)

#Clean it by replacing whitespaces with nan
clean_df = df.replace(r'\s+', np.nan, regex=True)

# Group on ID and take the first
clean_df.groupby('ID').first()

print(clean_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...