2016-05-22 8 views
5

मेरे पास फ्लैट्स (सकारात्मक और नकारात्मक) और कुछ NaN से भरा डेटाफ्रेम है। इस बड़े पैमाने पर प्रतिस्थापन बनाने के लिए"साइन" संख्याओं के साथ डेटाफ्रेम भरना

if it's NaN -> it remains Nan 
if positive -> replace with 1 
if negative -> replace with -1 
if zero -> leave it as 0 

कोई सुझाव: मैं अपने हस्ताक्षर के साथ हर एक नाव नंबर बदलना चाहते हैं?

अग्रिम धन्यवाद

उत्तर

4

आप boolean indexing उपयोग कर सकते हैं: कहां सीधे dataframe पारित कर सकते हैं

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A':[-1,3,0,5], 
        'B':[4,5,6,5], 
        'C':[8,-9,np.nan,7]}) 

print (df) 
    A B C 
0 -1 4 8.0 
1 3 5 -9.0 
2 0 6 NaN 
3 5 5 7.0 
print (df > 0) 
     A  B  C 
0 False True True 
1 True True False 
2 False True False 
3 True True True 

print (df < 0) 
     A  B  C 
0 True False False 
1 False False True 
2 False False False 
3 False False False 

df[df > 0] = 1 
df[df < 0] = -1 

print (df) 
    A B C 
0 -1 1 1.0 
1 1 1 -1.0 
2 0 1 NaN 
3 1 1 1.0 
+0

यह विधि कैसे काम करती है जब एक और कॉलम होता है जिसमें एक अलग डेटाटाइप होता है जैसे 'फ्लोट'? –

+0

मुझे लगता है कि ओपी कहता है कि फ्लोट और नाएन हैं। तो मुझे लगता है कि केवल संख्यात्मक मूल्य हैं। – jezrael

+0

आप सही हैं, लेकिन क्या कोई तरीका यह है कि यह विधि सामान्य मामले में काम करेगी? –

2

कोड -

import pandas as pd 


df = pd.DataFrame({'x' : [-5.3, 2.5, 0, float('nan')]}) 

df['x'] = df['x'].apply(func = lambda x : x if not x else x // abs(x)) 

print(df) 

आउटपुट -

x 
0 -1 
1 1 
2 0 
3 NaN 
+0

तुम क्यों लैम्ब्डा समारोह बना सकता हूँ? '.apply (संशोधित) 'ठीक काम करेगा – lejlot

+0

@lejlot अपडेट किया गया :) –

9

आप np.sign उपयोग कर सकते हैं:

df 
Out[100]: 
    A 
0 -4.0 
1 2.0 
2 NaN 
3 0.0 

import numpy as np 
np.sign(df["A"]) 

Out[101]: 
0 -1.0 
1 1.0 
2 NaN 
3 0.0 
Name: A, dtype: float64 

आदेश में सभी स्तंभों को लागू करने के लिए, y

df 
Out[121]: 
      0   1   2   3 
0 -2.932447 -1.686652  NaN -0.908441 
1 1.254436 0.000000 0.072242 0.796944 
2 2.626737 0.169639 -1.457195 1.169238 
3 0.000000 -1.174251 0.660111 1.115518 
4 -1.998091 -0.125095 0.000000 -0.506782 

np.sign(df) 
Out[122]: 
    0 1 2 3 
0 -1.0 -1.0 NaN -1.0 
1 1.0 0.0 1.0 1.0 
2 1.0 1.0 -1.0 1.0 
3 0.0 -1.0 1.0 1.0 
4 -1.0 -1.0 0.0 -1.0 
+1

क्या आप' डेटाफ्रेम 'में सभी कॉलम के लिए समाधान जोड़ सकते हैं? 'प्रिंट (df.apply (np.sign)) ' – jezrael

+2

सुपर, बहुत अच्छा समाधान। – jezrael

संबंधित मुद्दे