Разбить один ряд на несколько рядов - PullRequest
0 голосов
/ 04 марта 2020

У меня есть фрейм данных только с одной строкой.

from datetime import datetime
spark = SparkSession.builder.getOrCreate()
as_of_date = datetime.strptime('2013-01-01', '%Y-%m-%d')
columns = ['id', 'row', 'month']
vals = [('A', 1, as_of_date)]
df = spark.createDataFrame(vals, columns)

Я хочу создать больше строк на основе значения столбца 'row' 1, чтобы новый фрейм данных выглядел как

id, row, month
A, -2, 2012-10-01
A, -1, 2012-11-01
A, 0, 2012-12-01
A, 1, 2013-01-01

Смотри вверх, взрывайся, но все еще не могу понять, как именно это сделать.

Спасибо.

1 Ответ

1 голос
/ 04 марта 2020

Я не знаю, будет ли это работать с spark.

В pandas сначала я попытался использовать append() для добавления новых строк, а затем в обратном порядке

import pandas as pd
from datetime import datetime
from datetime import timedelta

as_of_date = datetime.strptime('2013-01-01', '%Y-%m-%d')
columns = ['id', 'row', 'month']
vals = [('A', 1, as_of_date)]
df = pd.DataFrame(vals, columns=columns)

#print(df.dtypes)
#print(df)

item = df.iloc[0].copy()  # original value

for x in range(3):
    item['row'] = -x
    item['month'] = item['month'] - timedelta(days=1)
    item['month'] = item['month'].replace(day=1)
    df = df.append(item)

# reverse and reset index
df = df[::-1].reset_index(drop=True)

print(df)

Но позже я выпустил, я могу сделать это напрямую с DataFrame

import pandas as pd
from datetime import datetime

as_of_date = datetime.strptime('2013-01-01', '%Y-%m-%d')
columns = ['id', 'row', 'month']
vals = [('A', 1, as_of_date)]

ID, ROW, MONTH = vals[0]
N = 4 # number of rows

df = pd.DataFrame({
    'id': [ID for _ in range(N)],
    'row': range(ROW, ROW-N, -1),
    'month': pd.date_range(MONTH, periods=N, freq='-1M')
})

# reverse and reset index
df = df[::-1].reset_index(drop=True)                     

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