熊猫数据转换

时间:2017-05-15 15:27:33

标签: python pandas

我在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')))

但我希望不必为每个机场编写此代码。

2 个答案:

答案 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& 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