Python 使用pandas预期的特定于类型的输出
我使用下面的代码计算了多重类型的ChangbTrued列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
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