【问题标题】:merge/duplicate two data sets by pandaspandas 合并/复制两个数据集
【发布时间】:2017-06-12 23:34:34
【问题描述】:

我正在尝试使用 pandas 合并两个数据集。一个是位置(经度和纬度),另一个是时间范围(0 到 24 小时,15 分钟步长 = 96 个数据点)

这里是示例代码:

s1 = pd.Series([1, 2, 3])
s2 = pd.Series([4, 5, 6])
df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

timeframe_array=[]
for i in range(0, 3600, timeframe):
    timeframe_array.append(i)

我想得到这样的数据:

   A  B  C  time
0  1  2  3     0
1  1  2  3    15
2  1  2  3    30
3  1  2  3    45
...

我怎样才能得到这样的数据?

【问题讨论】:

  • “合并”是指左连接吗?如果是这样:df1.join(df2, how='left').
  • 谢谢,但时间变量(0、15、30...)应该重复。抱歉,我编辑了原始问题(因为它很难理解)。
  • 我仍然不确定您在寻找什么。您想为df 中的每一行复制时间 0-3600(步长 = 15)吗?也就是说,最终数据帧的总行数为240 * 2 = 480
  • 是的,你是对的。数据点总数应为 480

标签: python pandas merge


【解决方案1】:

虽然不是特别优雅,但应该可以:

from __future__ import division  # only needed if you're using Python 2
import pandas as pd
from math import ceil

# Constants
timeframe = 15
total_t = 3600

创建df1:

s1 = [1, 2, 3]
s2 = [4, 5, 6]
df1 = pd.DataFrame([s1, s2], columns=['A', 'B', 'C'])

接下来,我们要构建df2,以便为df1 中的每一行复制序列0-3600(步骤=15)。我们可以使用df1.shape[0](在本例中为2)提取行数。

df2 = pd.DataFrame({'time': range(0, total_t * df1.shape[0], timeframe)})

接下来,您需要复制df1 中的行以匹配df2

factor = ceil(df2.shape[0] / df1.shape[0])
df1_f = pd.concat([df1] * factor).sort_index().reset_index(drop=True)

最后,将两个数据框连接在一起并剪掉多余的行。

df3 = df1_f.join(df2, how='left')[:df2.shape[0]]

Pandas 可能有一个内置的方法来做到这一点,但据我所知,joinmerge 只能通过填充常量来弥补行的差异(默认为NaN)。


结果:

>>> print(df3.head(4))

   A  B  C  time
0  1  2  3     0
1  1  2  3    15
2  1  2  3    30
3  1  2  3    45

>>> print(df3.tail(4))

     A  B  C  time
476  4  5  6  7140
477  4  5  6  7155
478  4  5  6  7170
479  4  5  6  7185

>>> df3.shape  # (480, 4)

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2018-03-14
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多