按日期范围合并数据框架&在python中重复一个分类列

时间:2016-07-28 06:46:24

标签: python python-2.7

我有两个数据帧:

df1:

Time             A   B
1469510289000   1.5 2.4
1469510290000   2.5 7.1
1469510291000   2.2 6.4
1469510292000   1.4 2.3
1469510293000   1.6 1.8
1469510294000   2.2 4.1
1469510295000   1.2 0.6

依旧......

DF2:

start             end         Category
1469510289000   1469510291000   A
1469510291000   1469510294000   B
1469510294000   1469510295000   A
1469510295000   NA              C

两个数据帧的时间都在时代。现在,我想合并df1& df2,基于start&来自df2的结束列,带有类别。最终结果数据框看起来像这样(df1):

Time             A  B  Category
1469510289000   1.5 2.4 A
1469510290000   2.5 7.1 A
1469510291000   2.2 6.4 B
1469510292000   1.4 2.3 B
1469510293000   1.6 1.8 B
1469510294000   2.2 4.1 A
1469510295000   1.2 0.6 C

能够通过使用np.peicewise将类别转换为float来解决它,但是当我的类别是文本或对象时,我该怎么做呢?请帮忙。感谢

2 个答案:

答案 0 :(得分:1)

不确定你的意思是什么“对象”但是..我想如果你的意思是类别是字符串类型,你可以将这些数据框转换成列表,在列表中字符串部分将自动成为这种形式 - > 'string',并将类别标签附加到相应的列表,可能会得到你想要的。

喜欢这个

df1:
 time  A    B
  1  1.5  2.4
  2  2.5  7.1
  3  2.2  6.4
  4  1.4  2.3
  5  1.6  1.8
  6  2.2  4.1
  7  1.2  0.6

df2:
start  end   category
  1     3    sthtxt1
  3     6    sthtxt2
  6     7    sthtxt1
  7    NA          C

F1 = df1.values.tolist()
F2 = df2.values.tolist()

for item1 in F1:
    for item2 in F2:
        if item1[0] >= item2[0] and item1[0] < item2[1]:
            item1.append(item2[2])

whatuwant=pd.DataFrame(F1)

whatuwant:
 time    A    B  category
  1.0  1.5  2.4  sthtxt1
  2.0  2.5  7.1  sthtxt1
  3.0  2.2  6.4  sthtxt2
  4.0  1.4  2.3  sthtxt2
  5.0  1.6  1.8  sthtxt2
  6.0  2.2  4.1  sthtxt1
  7.0  1.2  0.6        C

答案 1 :(得分:0)

这会对你有帮助吗?

list = []
for time in df1['Time']:
     category = None
     count=-1
     for start,end in zip(df2['start'],df2['end']):
         count += 1
         if ( time>=start and time <= end):
             break
     if count != -1:
         category = df2.ix[count]['Category']
     list.append(category)
df1['Category']=list
df1
     A    B           Time Category
0  1.5  2.4  1469510289000        A
1  2.5  7.1  1469510290000        A
2  2.2  6.4  1469510291000        A
3  1.4  2.3  1469510292000        B
4  1.6  1.8  1469510293000        B
5  2.2  4.1  1469510294000        B
6  1.2  0.6  1469510295000        A