Булевы утверждения Pandas для очистки набора данных - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю с некоторыми грязными данными EPA, которые необходимо очистить.Это выглядит так:

id   1   value1   2    value2   3   value3
1    ph    7     temp   44     cond  3
2    temp  45    cond   5      ph    5    
3    temp  12    ph     5      cond    8  

Я хотел бы создать новые столбцы ph, temp, alk, cond и т. Д., Сохраняя при этом каждое значение, соответствующее столбцу в строке,Ожидаемый результат будет выглядеть примерно так:

id   ph   temp   cond
1    7    44     3
2    5    45     5   
3    5    12     8  

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018
import pandas as pd

# Initialize example input dataframe
col_names = ['id', '1', 'value1', '2', 'value2', '3', 'value3']
data = [
    [1, 'ph', 7, 'temp', 44, 'cond', 3],
    [2, 'temp', 45, 'cond', 5, 'ph', 5],
    [3, 'temp', 12, 'ph', 5, 'cond', 8],
]
df = pd.DataFrame(data, columns=col_names)

# Reshape dataframe
df2 = pd.concat([
    df[['id', '1', 'value1']].rename(columns={'1': 'parameter', 'value1': 'value'}),
    df[['id', '2', 'value2']].rename(columns={'2': 'parameter', 'value2': 'value'}),
    df[['id', '3', 'value3']].rename(columns={'3': 'parameter', 'value3': 'value'}),
])
df2 = df2.pivot(index='id', columns='parameter', values='value')

дает в результате:

In [3]: df2
Out[3]:
parameter  cond  ph  temp
id
1             3   7    44
2             5   5    45
3             8   5    12
0 голосов
/ 15 ноября 2018

Давайте попробуем:

df1 = df.set_index('id')

df1.columns = ['Col'+i if i.isdigit() else i for i in df1.columns]

df2 = df1.reset_index()
pd.wide_to_long(df2, ['Col','value'],'id','num','','.+').reset_index(level=1, drop=True).set_index('Col', append=True)['value'].unstack()

Выход:

Col  cond  ph  temp
id                 
1       3   7    44
2       5   5    45
3       8   5    12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...