Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列中使用回购协议中的模块_Python_Pandas - Fatal编程技术网

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'