Python 在列中使用回购协议中的模块
我试图在熊猫数据帧的列中使用Python 在列中使用回购协议中的模块,python,pandas,Python,Pandas,我试图在熊猫数据帧的列中使用pyModeS中的一些模块 所讨论的数据帧如下所示: reply timeAtServer aircraftAddress 0 8daa6c326099d400d47d1e63b4c4 1.557497e+09 11168818 1 5daa6c32b53e75 1.557497e+09 11168818 2
pyModeS
中的一些模块
所讨论的数据帧如下所示:
reply timeAtServer aircraftAddress
0 8daa6c326099d400d47d1e63b4c4 1.557497e+09 11168818
1 5daa6c32b53e75 1.557497e+09 11168818
2 5daa6c32b53e75 1.557497e+09 11168818
3 8daa6c32234d7076d79e20295623 1.557497e+09 11168818
4 a41982db7067fdae209e5d93b760 1.557497e+09 11168818
... ... ...
1074083 02c1873a45a781 1.558654e+09 11339810
1074084 02c6073b626e6b 1.558654e+09 11339810
1074085 5dad7f539b6bea 1.558654e+09 11370323
1074086 8dad082299094b82e100172dd23f 1.558654e+09 11339810
1074087 02c1873bba5388 1.558654e+09 11339810
[1074088 rows x 3 columns]
我想根据“回复”列创建新列(DF、TC和RA),到目前为止我所做的是:
df['DF'] = df['reply'].apply(lambda x: pms.df(x))
df['TC'] = df['reply'].apply(lambda x: pms.adsb.typecode(x))
df['RA'] = df['reply'].apply(lambda x: pms.bds.bds30.is30(x) if len(x) > 14 else '...')
这很好,但我相信一定有一种更优雅、更快的方法来实现这一点
注:pms.df(x)
给出整数,pms.adsb.typecode(x)
给出整数和'NaN',pms.bds.bds30.is30(x)
给出布尔值(真或假)
另外,再次基于第一列,我想应用一个模块(pms.adsb.icao(x)
),但仅应用于reply
中的RA
为“True”的行。这就像是双重条件或类似的东西,我无法控制它
目前,我唯一能做的事情就是在RA的索引为True时获取它,然后循环编写新的专栏,但是这需要永远:
IDX = df.index[df['RA'] == True].tolist()
for x in IDX:
df['icao24'] = df['reply'].apply(lambda x: pms.adsb.icao(x))
这是全部代码:
import pandas as pd
import pyModeS as pms
df = pd.read_csv (r'C:\Users\Shadow\Desktop\opensky_tcas_incidents_raw_dedup.csv')
df['DF'] = df['reply'].apply(lambda x: pms.df(x))
df['TC'] = df['reply'].apply(lambda x: pms.adsb.typecode(x))
df['RA'] = df['reply'].apply(lambda x: pms.bds.bds30.is30(x) if len(x) > 14 else '...')
IDX = df.index[df['RA'] == True].tolist()
for x in IDX:
df['icao24'] = df['reply'].apply(lambda x: pms.adsb.icao(x))
使用自定义功能,遗憾的是性能取决于
pms
模块处理:
def f(x):
DF = pms.df(x)
TC = pms.adsb.typecode(x)
RA = pms.bds.bds30.is30(x) if len(x) > 14 else '...'
icao24 = pms.adsb.icao(x) if RA == 'True' else None
return pd.Series([DF, TC, RA, icao24])
df[['DF','TC','RA','icao24']] = df['reply'].apply(f)
您的代码只应在第二部分进行优化,在第一部分中,只可能删除一些lambda:
df['DF'] = df['reply'].apply(pms.df)
df['TC'] = df['reply'].apply(pms.adsb.typecode)
df['RA'] = df['reply'].apply(lambda x: pms.bds.bds30.is30(x) if len(x) > 14 else '...')
mask = df['RA'] == 'True'
df.loc[mask, 'icao24'] = df.loc[mask, 'reply'].apply(lambda x: pms.adsb.icao(x))
正如您所说,这个自定义函数很优雅,但它比我的MWE慢得多。无论如何,谢谢。@PeterLaAnguila-是的,添加了为
icao24
优化的代码。不再支持带有任何缺少标签的loc或[]。缺少以下标签:索引(['…'、'…'、'…'、'…'、'…'、\n…\n'、'、'、'…'、'、'、'…]、\n dtype='object',length=692832)请看“@PeterLaAnguila-hmm,那么'True'
是字符串吗?然后使用mask=df['RA']=='True'