更改特定行中的符号熊猫

S.A*_*S.A 3 python pandas

这是我的第一篇文章,所以我试图以正确的格式来做。我有两列包含文本和值以及索引日期。

Date  Zweck  Betrag                                 
2014-09-26 00:00:00   Gehalt    22.0  
2014-09-26 01:00:00     REWE     1.0  
2014-09-26 02:00:00    Edeka    76.0  
2014-09-26 03:00:00     Bike    51.0  
2014-09-26 04:00:00      ING    64.0  
2014-09-26 05:00:00  Allianz    93.0  
2014-09-26 06:00:00     Bahn     8.0  
2014-09-26 07:00:00  Kaufhof    33.0  
2014-09-26 08:00:00       CA     6.0  
2014-09-26 09:00:00    Shell    55.0  
Run Code Online (Sandbox Code Playgroud)

如果 Text 不是 Salary (所以是负值),我想做的是翻转每一行中的符号。我用这种方法尝试过,但我不起作用:

for r in np.arange(len(df)):
            if df.ix[r].Zweck != 'Gehalt':
                    betrag = df.ix[r].Betrag
                    df.loc[r, 'Betrag'] = -1 * betrag 
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 7

选项 1
您不必使用循环进行迭代。Pandasloc为您矢量化了这个替代品。

df.loc[df.Zweck != 'Gehalt', 'Betrag'] *= -1
Run Code Online (Sandbox Code Playgroud)

df

                  Date    Zweck  Betrag
0  2014-09-26 00:00:00   Gehalt    22.0
1  2014-09-26 01:00:00     REWE    -1.0
2  2014-09-26 02:00:00    Edeka   -76.0
3  2014-09-26 03:00:00     Bike   -51.0
4  2014-09-26 04:00:00      ING   -64.0
5  2014-09-26 05:00:00  Allianz   -93.0
6  2014-09-26 06:00:00     Bahn    -8.0
7  2014-09-26 07:00:00  Kaufhof   -33.0
8  2014-09-26 08:00:00       CA    -6.0
9  2014-09-26 09:00:00    Shell   -55.0
Run Code Online (Sandbox Code Playgroud)

分配到位,便宜且快速。


选项 2
或者,您可以使用np.where,它为您提供了一个可以重新分配的新系列。

df['Betrag'] = np.where(df.Zweck != 'Gehalt', df.Betrag * -1, df.Betrag)
Run Code Online (Sandbox Code Playgroud)

df

                  Date    Zweck  Betrag
0  2014-09-26 00:00:00   Gehalt    22.0
1  2014-09-26 01:00:00     REWE    -1.0
2  2014-09-26 02:00:00    Edeka   -76.0
3  2014-09-26 03:00:00     Bike   -51.0
4  2014-09-26 04:00:00      ING   -64.0
5  2014-09-26 05:00:00  Allianz   -93.0
6  2014-09-26 06:00:00     Bahn    -8.0
7  2014-09-26 07:00:00  Kaufhof   -33.0
8  2014-09-26 08:00:00       CA    -6.0
9  2014-09-26 09:00:00    Shell   -55.0
Run Code Online (Sandbox Code Playgroud)

选项 3 另一个,带mask/ where-

df.Betrag = df.Betrag.where(df.Zweck != 'Gehalt', df.Betrag)
Run Code Online (Sandbox Code Playgroud)

或者,

df.Betrag = df.Betrag.mask(df.Zweck == 'Gehalt', df.Betrag)
Run Code Online (Sandbox Code Playgroud)

或者,您可以df.update改为使用,这样就无需重新分配。

df.update(df.Betrag.where(df.Zweck != 'Gehalt', df.Betrag))
Run Code Online (Sandbox Code Playgroud)

df

                  Date    Zweck  Betrag
0  2014-09-26 00:00:00   Gehalt    22.0
1  2014-09-26 01:00:00     REWE    -1.0
2  2014-09-26 02:00:00    Edeka   -76.0
3  2014-09-26 03:00:00     Bike   -51.0
4  2014-09-26 04:00:00      ING   -64.0
5  2014-09-26 05:00:00  Allianz   -93.0
6  2014-09-26 06:00:00     Bahn    -8.0
7  2014-09-26 07:00:00  Kaufhof   -33.0
8  2014-09-26 08:00:00       CA    -6.0
9  2014-09-26 09:00:00    Shell   -55.0
Run Code Online (Sandbox Code Playgroud)