爆炸成多行

时间:2020-03-03 21:39:07

标签: python pyspark

我的数据框只有一行。

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)

我想基于“行”列的值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 个答案:

答案 0 :(得分:1)

我不知道它是否可以与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)