为了账号安全,请及时绑定邮箱和手机立即绑定

根据来自另一个数据框的行范围添加/填充熊猫列

根据来自另一个数据框的行范围添加/填充熊猫列

陪伴而非守候 2021-05-15 08:30:20
使用熊猫,我已经按时间样本对df1进行了索引:data = '''\time       flags    input                  8228835.0  53153.0  32768.08228837.0  53153.0  32768.08228839.0  53153.0  32768.08228841.0  53153.0  32768.08228843.0  61345.0  32768.0'''fileobj = pd.compat.StringIO(data)df1 = pd.read_csv(fileobj, sep='\s+', index_col='time')df2以开始和结束指示时间范围,以定义“ check”状态为True的范围:data = '''\        check     start       end20536   True   8228837   822899320576   True   8232747   823286920554   True   8230621   823076120520   True   8227351   822750720480   True   8223549   822366920471   True   8221391   8221553'''fileobj = pd.compat.StringIO(data)df2 = pd.read_csv(fileobj, sep='\s+')我需要做的是在df1中添加一列“检查”,并用True值填充df2中定义的实际时间范围。所有其他人都应该是错误的。一个示例结果将是:             flags    input    checktime                       8228835.0  53153.0  32768.0    False8228837.0  53153.0  32768.0    True8228839.0  53153.0  32768.0    True8228841.0  53153.0  32768.0    True8228843.0  61345.0  32768.0    True....8228994.0. 12424.0. 32768.0.   False
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您可以创建一个列表或范围,然后pd.Index.isin与使用itertools.chain:


from itertools import chain


df2 = df2[df2['check']]


ranges = map(range, df2['start'], df2['end'])


df1['check'] = df1.index.isin(chain.from_iterable(ranges))


print(df1)


             flags    input  check

time                              

8228835.0  53153.0  32768.0  False

8228837.0  53153.0  32768.0   True

8228839.0  53153.0  32768.0   True

8228841.0  53153.0  32768.0   True

8228843.0  61345.0  32768.0   True


查看完整回答
反对 回复 2021-05-18
?
倚天杖

TA贡献1828条经验 获得超3个赞

我想你可以使用IntervalIndex与loc


df2.index=pd.IntervalIndex.from_arrays(df2.start,df2.end,'both')

df2.loc[df.index]

Out[174]: 

        check  start  end

[1, 2]   True      1    2

[4, 5]   True      4    5

[7, 8]   True      7    8

df['newcol']=df2.loc[df.index].check.values.tolist()

df

Out[176]: 

       flags    input  newcol

flags                        

2          2  32768.0    True

4          4  32768.0    True

7          7  32768.0    True


查看完整回答
反对 回复 2021-05-18
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

使用的列表理解any()。但是,如果您可以为我们运行%timing,那么对实际性能没有任何了解,那就太好了!


df1['check'] = [any(start <= i <= end for start,end in 

                    zip(df2['start'], df2['end'])) for i in df1.index]


print(df1)

返回值:


             flags    input  check

time                              

8228835.0  53153.0  32768.0  False

8228837.0  53153.0  32768.0   True

8228839.0  53153.0  32768.0   True

8228841.0  53153.0  32768.0   True

8228843.0  61345.0  32768.0   True


查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号