मेरे पास एक एक्सेल फ़ाइल है जिसे 'nan_test.xlsx' कहा जाता है। जो इस तरह दिखता है (मूल में रिक्त स्थान हैं लेकिन जब अजगर में मुद्रित किया जाता है तो रिक्त स्थान को 'NaN' से बदल दिया जाता है:

    ID  Month1  Month2  Month3
0  ABC     1.0               
1  FFF     2.0     2.0     2.0
2  XYZ             3.0     3.0

मैं रिक्त/नैन मानों को अनदेखा करते हुए मानक विचलन प्राप्त करने का प्रयास कर रहा हूं।

अभी तक मेरे पास यह है लेकिन व्यवहार हर जगह है। यह 3 संख्यात्मक मान, 2 संख्यात्मक मान और एक नान मान वाली पंक्ति के लिए std dev सही ढंग से करता है, लेकिन 2 nan मान और एक संख्यात्मक मान वाला नहीं।

df = pd.read_excel('nan_test.xlsx')
print(df)
df['std'] = np.nanstd(df.iloc[:, 1:], axis=1, ddof=1)
print(df)

    ID  Month1  Month2  Month3
0  ABC     1.0     NaN     NaN
1  FFF     2.0     2.0     2.0
2  XYZ     NaN     3.0     3.0
    ID  Month1  Month2  Month3  std
0  ABC     1.0     NaN     NaN  NaN
1  FFF     2.0     2.0     2.0  0.0
2  XYZ     NaN     3.0     3.0  0.0
1
stackoverflow 28 अगस्त 2020, 21:14

2 जवाब

सबसे बढ़िया उत्तर

यह ddof=1 के कारण पहली पंक्ति std NaN लौट रही है।

ddof : int, optional

Means Delta Degrees of Freedom. The divisor used in calculations is N - ddof, 
where N represents the number of non-NaN elements. By default ddof is zero.

तो, पहली पंक्ति का N 1 है (अर्थात केवल 1 गैर-NaN मान है)। N - ddof = 1 - 1 = 0. भाजक 0 है, इसलिए std रिटर्न NaN

पहली पंक्ति के लिए आपको ddof=0 की आवश्यकता है

df['std'] = np.nanstd(df.iloc[:, 1:], axis=1, ddof=0)

Out[416]:
    ID  Month1  Month2  Month3  std
0  ABC     1.0     NaN     NaN  0.0
1  FFF     2.0     2.0     2.0  0.0
2  XYZ     NaN     3.0     3.0  0.0
1
Andy L. 28 अगस्त 2020, 21:34

मुद्दा यह है कि आप स्वतंत्रता की डेल्टा डिग्री (ddof) को 1 पर सेट कर रहे हैं। जैसा कि np.nanstd:

गणना में प्रयुक्त भाजक N - ddof है, जहाँ N गैर-NaN तत्वों की संख्या का प्रतिनिधित्व करता है। डिफ़ॉल्ट रूप से ddof शून्य है।

तो इसे 1 पर सेट करके, जब आपके पास केवल 1 मान होता है जो NaN नहीं है, तो भाजक 0 हो जाता है, और आपको NaN मिलता है।

यदि आप सेट ddof=0 में बदलते हैं, तो आपको पहली पंक्ति के मानक विचलन के लिए 0 का मान मिलता है

1
tmdavison 28 अगस्त 2020, 21:39