Прочитать фрейм данных, разделенный на нан строк, и извлечь указанные c столбцы в Python - PullRequest
0 голосов
/ 04 августа 2020

У меня есть пример файла excel data2.xlsx из здесь , который имеет Sheet1 следующим образом:

enter image description here

Preprocess:

The columns 2018, 2019, 2020, num are object type, which I need to convert to float:

cols = ['2018', '2019', '2020', 'num']
df[cols].replace('--', np.nan, regex=True).astype(float)

Also I need to extract city names from bj, sh, gz, sz from 2019-bj-price-quantity, 2019-sh-price-quantity, 2019-gz-price-quantity, 2019-sz-price-quantity

pattern = '|'.join(['2019-', '-price-quantity'])
df['city'] = df['city'].str.replace(pattern, '')

Finally I need to extract price and quantity of nums for each city and reshape a new dataframe like this:

Чтение кадра данных, разделенное на nan строк и преобразовать их в несколько фреймов данных в Python

Ответы [ 2 ]

1 голос
/ 04 августа 2020

* обратите внимание, что я использую индексы столбцов, когда имя столбца не определено

Вы можете разделить таблицы с помощью

df['city'] = df.groupby(df.iloc[:, 0].isna().cumsum()).transform(first)
df.dropna(subset=df.columns[0], inplace=True)
df = df.loc[df[df.colmns[0]] != df.city]

Теперь df будет иметь дополнительный столбец city с заголовок таблицы, а заголовок и пустые строки были отброшены. Вы можете получить доступ к любой части этого столбца city с помощью .str.split.str.get

df.city = df.city.str.split('-').str.get(1)

Наконец, вы хотите сохранить только столбец num, что является самым простым шагом

df = df.iloc[:, [0, 4, 5]]
df = df.pivot(index='city', columns=df.columns[0], values=df.columns[1])
0 голосов
/ 05 августа 2020

Мой код, основанный на отличном ответе Джезраэля, добро пожаловать, чтобы поделиться лучшим решением или улучшить его:

# add header=None for default columns names
df = pd.read_excel('./data2.xlsx', sheet_name = 'Sheet1', header=None)

# convert columns by second row
df.columns = df.iloc[1].rename(None)

# create new column `city` by forward filling non missing values by second column
df.insert(0, 'city', df.iloc[:, 0].mask(df.iloc[:, 1].notna()).ffill())

pattern = '|'.join(['2019-', '-price-quantity'])
df['city'] = df['city'].str.replace(pattern, '')
df['year'] = df['year'].str.replace(pattern, '')
# convert floats to integers 
df.columns = [int(x) if isinstance(x, float) else x for x in df.columns]
df = df[df.year.isin(['price', 'quantity'])]
df = df[['city', 'year', 'num']]
df['num'] = df['num'].replace('--', np.nan, regex=True).astype(float)
df = df.set_index(['city', 'year']).unstack().reset_index()
df.columns = df.columns.droplevel(0)
df.rename({'year': 'city'}, axis=1, inplace=True)
print(df)

Out:

year      price  quantity
0     bj   21.0      10.0
1     gz    6.0      15.0
2     sh   12.0       NaN
3     sz   13.0       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...