Python 使用pandas预期的特定于类型的输出

Python 使用pandas预期的特定于类型的输出,python,pandas,Python,Pandas,我使用下面的代码计算了多重类型的ChangbTrued列 for v in df['Type'].unique(): df[f'Changebetweenreadings_{v}'] = df.loc[df['Type'].eq(v), 'Last'].diff() 给定 现在我需要根据这些changebtw列计算方向列 我的输出应该是 Type change_dir_ada change_dir_btc change_dir_eur ada Nut

我使用下面的代码计算了多重类型的ChangbTrued列

for v in df['Type'].unique():
    df[f'Changebetweenreadings_{v}'] = df.loc[df['Type'].eq(v), 'Last'].diff()
给定

现在我需要根据这些changebtw列计算方向列

我的输出应该是

Type    change_dir_ada    change_dir_btc   change_dir_eur   
ada       Nut
ada       Pos
btc                          Nut
ada       Neg
btc                          Nut
eur
eur                                               Pos
我尝试的一个快速修复方法是使用此代码

df.loc[df.Changebetweenreadings_btceur > 0, 'ChangeDirection_btceur'] = 'Pos' 
df.loc[df.Changebetweenreadings_btceur < 0, 'ChangeDirection_btceur'] = 'Neg' 
df.loc[df.Changebetweenreadings_btceur == 0, 'ChangeDirection_btceur'] = 'Nut'

df.loc[df.Changebetweenreadings_adabtc > 0, 'ChangeDirection_adabtc'] = 'Pos' 
df.loc[df.Changebetweenreadings_adabtc < 0, 'ChangeDirection_adabtc'] = 'Neg' 
df.loc[df.Changebetweenreadings_adabtc == 0, 'ChangeDirection_adabtc'] = 'Nut'
它不适用于这些值

change        type    dir_ada   dir_btc
-3637.31      ada      
-4E-08        ada       Neg
-3637.31      ada       Nut
3637.8        btc                  Nut
代替Pos,它提供随机映射。

我相信您需要:

vals = ['Pos','Neg', 'Nut']
for v in df['Type'].unique():
    df[f'change_dir_{v}'] = df.loc[df['Type'].eq(v), 'Last'].diff()
    df[f'change_dir_{v}'] = np.select([df[f'change_dir_{v}'] > 0, 
                                       df[f'change_dir_{v}'] < 0, 
                                       df[f'change_dir_{v}']== 0], vals, '')


print (df)
  Type     Last change_dir_ada change_dir_btc change_dir_eur
0  ada  3071.56                                             
1  ada  3097.80            Pos                              
2  btc  1000.00                                             
3  ada  2000.00            Neg                              
4  btc  3000.00                           Pos               
5  eur  1000.00                                             
6  eur  1500.00                                          Pos
vals=['Pos','Neg','Nut']
对于df['Type']中的v.unique():
df[f'change_dir{v}']=df.loc[df['Type'].eq(v),'Last'].diff()
df[f'change_dir_{v}']=np.select([df[f'change_dir_{v}']>0,
df[f'change_dir{v}']<0,
df[f'change_dir_{v}']==0],VAL',)
打印(df)
键入上次更改\u目录\u ada更改\u目录\u btc更改\u目录\u eur
0 ada 3071.56
1 ada 3097.80位置
2 btc 1000.00
3 ada 2000.00负
4 btc 3000.00位置
5欧元1000.00
6欧元1500.00 Pos
我相信您需要:

vals = ['Pos','Neg', 'Nut']
for v in df['Type'].unique():
    df[f'change_dir_{v}'] = df.loc[df['Type'].eq(v), 'Last'].diff()
    df[f'change_dir_{v}'] = np.select([df[f'change_dir_{v}'] > 0, 
                                       df[f'change_dir_{v}'] < 0, 
                                       df[f'change_dir_{v}']== 0], vals, '')


print (df)
  Type     Last change_dir_ada change_dir_btc change_dir_eur
0  ada  3071.56                                             
1  ada  3097.80            Pos                              
2  btc  1000.00                                             
3  ada  2000.00            Neg                              
4  btc  3000.00                           Pos               
5  eur  1000.00                                             
6  eur  1500.00                                          Pos
vals=['Pos','Neg','Nut']
对于df['Type']中的v.unique():
df[f'change_dir{v}']=df.loc[df['Type'].eq(v),'Last'].diff()
df[f'change_dir_{v}']=np.select([df[f'change_dir_{v}']>0,
df[f'change_dir{v}']<0,
df[f'change_dir_{v}']==0],VAL',)
打印(df)
键入上次更改\u目录\u ada更改\u目录\u btc更改\u目录\u eur
0 ada 3071.56
1 ada 3097.80位置
2 btc 1000.00
3 ada 2000.00负
4 btc 3000.00位置
5欧元1000.00
6欧元1500.00 Pos


您是否正在寻找
df.groupby('Type')
?不,我不想按分组。了解您的数据会有帮助(是
Type
还是
在一个数据帧之间更改?为什么长度不同?)。这也有助于了解您面临的错误或您希望实现的目标。(例如,为什么从长度为5和8的两个系列中获得2列6行)。我们也不知道列
'Last'
的内容。您好,请检查更新的问题@cripcate您是否正在寻找
df.groupby('Type')
?不,我不想按分组。了解您的数据会有帮助(是
类型
编辑之间的更改
一个数据帧?为什么长度不同?)。这也有助于了解您面临的错误或您希望实现的目标。(例如,为什么从长度为5和8的两个系列中获得2列6行)。我们也不知道列
'Last'
的内容。您好,请检查更新的问题@cripcate请检查我在尝试此代码后得到的错误。它适用于大多数情况,一段时间后,它会给出随机映射。@KSp-我尝试简化解决方案,但不确定是否理解
随机映射
。对不起,我的意思是,它会随机分配位置来代替neg或nut。就像它随机分配,没有任何逻辑,我的意思是:)@KSp-hmmm,有负数太小,所以不容易检查。e、 g.
n=-4E-08
然后
print(f'{n:.10f}')
但是像-3643.909983这样的值呢?因为我的值从两位数开始,最后有更多的值,甚至是负数。所以,它仍然分配错误。我尝试了你的新代码。请检查尝试此代码后出现的错误。它适用于大多数情况,一段时间后,它会给出随机映射。@KSp-我尝试简化解决方案,但不确定是否理解
随机映射
。对不起,我的意思是,它会随机分配位置来代替neg或nut。就像它随机分配,没有任何逻辑,我的意思是:)@KSp-hmmm,有负数太小,所以不容易检查。e、 g.
n=-4E-08
然后
print(f'{n:.10f}')
但是像-3643.909983这样的值呢?因为我的值从两位数开始,最后有更多的值,甚至是负数。所以,它仍然分配错误。我试过你的新密码。
vals = ['Pos','Neg', 'Nut']
for v in df['Type'].unique():
    df[f'change_dir_{v}'] = df.loc[df['Type'].eq(v), 'Last'].diff()
    df[f'change_dir_{v}'] = np.select([df[f'change_dir_{v}'] > 0, 
                                       df[f'change_dir_{v}'] < 0, 
                                       df[f'change_dir_{v}']== 0], vals, '')


print (df)
  Type     Last change_dir_ada change_dir_btc change_dir_eur
0  ada  3071.56                                             
1  ada  3097.80            Pos                              
2  btc  1000.00                                             
3  ada  2000.00            Neg                              
4  btc  3000.00                           Pos               
5  eur  1000.00                                             
6  eur  1500.00                                          Pos