我在Pandas数据框中有以下数据:
AIRPORT
EWR|JAX
EWR|BHX
EWR|BHX
EWR|BHX
EWR|BHX
... 有没有动态的方法将其转换为:
AIRPORT EWR JAX BHX
EWR|JAX Y Y NULL
EWR|BHX Y NULL Y
等等。如果我想计算硬编码值
,我知道如何做到这一点 df.assign(EWR = lambda x: x.TYPE.apply(lambda y: y.split('|').count('EWR')))
但我希望不必为每个机场编写此代码。
答案 0 :(得分:5)
您可以使用getJson(){
this.ForecastService.getWeather().subsribe(res=>{ this.data = res.data})
}
访问者和.str
,然后使用get_dummies
进行字典解包,以在数据框中创建其他列。并且,最后assign
将那些0和1改为你的str,bool和nan。
replace
输出:
df_out = df.assign(**df.AIRPORT.str.get_dummies().replace({1:'Y',0:np.nan}))
print(df_out)
答案 1 :(得分:3)
pandas
<强>时序强> 大数据 str.get_dummies
dummies = df.AIRPORT.str.get_dummies()
df.join(
dummies * pd.Series('Y', dummies.columns)
).replace('', np.nan)
AIRPORT BHX EWR JAX
0 EWR|JAX nan Y Y
1 EWR|BHX Y Y nan
2 EWR|BHX Y Y nan
3 EWR|BHX Y Y nan
4 EWR|BHX Y Y nan
pandas
&amp; numpy
np.where
dummies = df.AIRPORT.str.get_dummies()
d1 = pd.DataFrame(
np.where(dummies.values == 1, 'Y', np.nan),
dummies.index, dummies.columns
)
d2 = df.join(d1)
print(d2)
AIRPORT BHX EWR JAX
0 EWR|JAX nan Y Y
1 EWR|BHX Y Y nan
2 EWR|BHX Y Y nan
3 EWR|BHX Y Y nan
4 EWR|BHX Y Y nan
小数据 %%timeit
df.join(
df.AIRPORT.str.get_dummies() * pd.Series('Y', dummies.columns)
).replace('', np.nan)
100 loops, best of 3: 2.31 ms per loop
%timeit df.assign(**df.AIRPORT.str.get_dummies().replace({1:'Y',0:np.nan}))
100 loops, best of 3: 2.78 ms per loop
%%timeit
dummies = df.AIRPORT.str.get_dummies()
d1 = pd.DataFrame(
np.where(dummies.values == 1, 'Y', np.nan),
dummies.index, dummies.columns
)
df.join(d1)
1000 loops, best of 3: 1.65 ms per loop
from string import ascii_uppercase
np.random.seed([3,1415])
source = pd.DataFrame(
np.random.choice(list(ascii_uppercase), [100, 3])
).sum(1).unique()
df = pd.DataFrame(
np.random.choice(source, [10000, 2]), columns=['A', 'B']
).query('A != B').apply('|'.join, 1).to_frame('AIRPORT')
%%timeit
dummies = df.AIRPORT.str.get_dummies()
df.join(
dummies * pd.Series('Y', dummies.columns)
).replace('', np.nan)
1 loop, best of 3: 594 ms per loop
%timeit df.assign(**df.AIRPORT.str.get_dummies().replace({1:'Y',0:np.nan}))
1 loop, best of 3: 629 ms per loop
%%timeit
dummies = df.AIRPORT.str.get_dummies()
d1 = pd.DataFrame(
np.where(dummies.values == 1, 'Y', np.nan),
dummies.index, dummies.columns
)
df.join(d1)
1 loop, best of 3: 592 ms per loop