我有两个数据帧:
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来解决它,但是当我的类别是文本或对象时,我该怎么做呢?请帮忙。感谢
答案 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