पांडस फिलना () के तर्क के रूप में एक और संपूर्ण कॉलम कैसे पास करें


94

मैं एक कॉलम में दूसरे कॉलम से वैल्यू के साथ मिसिंग वैल्यूज भरना चाहूंगा fillna

(मैंने पढ़ा है कि प्रत्येक पंक्ति के माध्यम से लूपिंग करना बहुत बुरा अभ्यास होगा और यह बेहतर होगा कि सब कुछ एक ही बार में किया जाए लेकिन मुझे यह पता नहीं चल पाया कि यह कैसे करना है fillna।)

पहले डेटा:

Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    NaN   ant

डेटा के बाद:

Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    ant   ant

जवाबों:


173

आप इस कॉलम को fillna( डॉक्स देखें ) प्रदान कर सकते हैं , यह भरने के लिए मिलान सूचकांक पर उन मूल्यों का उपयोग करेगा:

In [17]: df['Cat1'].fillna(df['Cat2'])
Out[17]:
0    cat
1    dog
2    cat
3    ant
Name: Cat1, dtype: object

7
अच्छा! मुझे नहीं पता था कि fillnaएक श्रृंखला होती है।
अमी तेवरी

1
धन्यवाद! मैंने सोचा कि सीरी को NA मूल्यों की संख्या का सटीक आकार होना था।
xav

यह बहुरंगी रेखाओं के लिए डेटाफ्रेम के लिए भी काम करता है। फिलना की वह विशेषता बहुत सहायक है।
वार्टिकाल

19

तुम यह कर सकते थे

df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)

RHS पर समग्र निर्माण रसोई की pandasकिताब (जो इसे किसी भी मामले में पढ़ने के लिए भुगतान करता है) से टर्नरी पैटर्न का उपयोग करता है । यह एक वेक्टर संस्करण है a? b: c


इस समस्या के लिए मैंने कोई हल नहीं बल्कि बहुत ही दिलचस्प पैटर्न का उपयोग किया है! धन्यवाद!
xav

क्या कई स्तंभों के लिए इसका उपयोग करने का एक तरीका है? जैसे अगर इस df के पास cat1, cat2, cat3, cat4, cat5 था और मान लीजिए कि cat5 खाली था। क्या cat1 से मानों के साथ cat5 भरने का एक तरीका होगा यदि cat1 खाली है तो cat2, अगर cat2 खाली है तो cat3 इत्यादि?
user8322222

@ user8322222 मुझे निश्चित रूप से देर हो रही है लेकिन अगर किसी के पास यह सवाल है, तो आप नेस्टेड np.where कर सकते हैं, जैसे आप एक्सेल सेल में करेंगे = np.where (cond, val_true, np.where (cond, val_true, val_false), )।
कैसर

आप उल्लेख करना चाहते हैं कि यह सिर्फ पंडों के निर्माण को पुनर्परिभाषित कर रहा है pd.DataFrame.fillna()। और मुझे संदेह है कि कोने-मामले का व्यवहार अलग-अलग हो सकता है जैसे अलग-अलग डेटाफ़्रेम से बेमेल श्रृंखला की लंबाई के लिए: dfA ['Cat1'], dfB ['Cat2']
smci

8

valueइसके बजाय बस पैरामीटर का उपयोग करें method:

In [20]: df
Out[20]:
  Cat1      Cat2  Day
0  cat     mouse    1
1  dog  elephant    2
2  cat     giraf    3
3  NaN       ant    4

In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2)

In [22]: df
Out[22]:
  Cat1      Cat2  Day
0  cat     mouse    1
1  dog  elephant    2
2  cat     giraf    3
3  ant       ant    4

जवाब के लिए धन्यवाद! जोरिस द्वारा वर्णित विधि के बजाय मूल्य का उपयोग करने के लिए यह क्या बदलता है?
xav

@xav valueपहला पैरामीटर है, इसलिए जॉरिस वास्तव में ठीक यही काम कर रहा है। जैसा कि उन्होंने कहा, डॉक्स देखें ।
चिरसायकॉक

हां, डॉकस्ट्रिंग थोड़ा भ्रामक है जैसा methodकि पहले वहां सूचीबद्ध है।
जॉरिस

7

pandas.DataFrame.combine_first भी काम करता है।

( ध्यान दें: चूंकि "परिणाम सूचकांक कॉलम संबंधित सूचकांक और स्तंभों का मिलन होगा", आपको सूचकांक की जांच करनी चाहिए और स्तंभों का मिलान किया जाना चाहिए। )

import numpy as np
import pandas as pd
df = pd.DataFrame([["1","cat","mouse"],
    ["2","dog","elephant"],
    ["3","cat","giraf"],
    ["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])

In: df["Cat1"].combine_first(df["Cat2"])
Out: 
0    cat
1    dog
2    cat
3    ant
Name: Cat1, dtype: object

अन्य उत्तरों के साथ तुलना करें:

%timeit df["Cat1"].combine_first(df["Cat2"])
181 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit df['Cat1'].fillna(df['Cat2'])
253 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
88.1 µs ± 793 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

मैंने नीचे इस विधि का उपयोग नहीं किया:

def is_missing(Cat1,Cat2):    
    if np.isnan(Cat1):        
        return Cat2
    else:
        return Cat1

df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)

क्योंकि यह एक अपवाद बढ़ाएगा:

TypeError: ("ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''", 'occurred at index 0')

जिसका अर्थ है कि np.isnan को देशी dtype (जैसे np.float64) के NumPy सरणियों पर लागू किया जा सकता है, लेकिन ऑब्जेक्ट सरणियों पर लागू होने पर TypeError उठाता है ।

इसलिए मैं विधि को संशोधित करता हूं:

def is_missing(Cat1,Cat2):    
    if pd.isnull(Cat1):        
        return Cat2
    else:
        return Cat1

%timeit df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
701 µs ± 7.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

0

यहाँ एक अधिक सामान्य दृष्टिकोण है (भरण विधि शायद बेहतर है)

def is_missing(Cat1,Cat2):    
    if np.isnan(Cat1):        
        return Cat2
    else:
        return Cat1

df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)

0

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे हाल ही में कुछ ऐसा करने की आवश्यकता थी। मैं निम्नलिखित का उपयोग करने में सक्षम था:

df = pd.DataFrame([["1","cat","mouse"],
    ["2","dog","elephant"],
    ["3","cat","giraf"],
    ["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])

print(df)

  Day Cat1      Cat2
0   1  cat     mouse
1   2  dog  elephant
2   3  cat     giraf
3   4  NaN       ant

df1 = df.bfill(axis=1).iloc[:, 1]
df1 = df1.to_frame()
print(df1)

कौन सी पैदावार:

  Cat1
0  cat
1  dog
2  cat
3  ant

आशा है कि यह किसी के लिए उपयोगी है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.