एक लुकअप टेबल के साथ पांडस भरना - पायथन, पांडा

NaN भरने के साथ कुछ परेशानी हो रही है।मैं कुछ NaNs के साथ डेटाफ्रेम कॉलम लेना चाहता हूं और उन्हें किसी अन्य कॉलम के मान के आधार पर "लुकअप टेबल" से व्युत्पन्न मान के साथ भरना चाहता हूं। (आप टाइटैनिक डेटा सेट से अपना डेटा पहचान सकते हैं) ...

    Pclass   Age
0   1        33
1   3        24
2   1        23
3   2        NaN
4   1        Nan

मैं श्रृंखला "pclass_lookup" से मूल्य के साथ NaN भरना चाहता हूं:

pclass_lookup
1        38.1
2        29.4
3        25.2

मैंने अनुक्रमण के साथ भरण करने की कोशिश की है जैसे:

df.Age.fillna(pclass_lookup[df.Pclass]), but it gives me an error of
ValueError: cannot reindex from a duplicate axis

lambdas भी एक कोशिश कर रहे थे:

df.Age.map(lambda x: x if x else pclass_lookup[df.Pclass]

लेकिन, ऐसा लगता है कि यह सही नहीं है, या तो। क्या मैं यहां नाव को पूरी तरह याद कर रहा हूं? "

उत्तर:

जवाब के लिए 2 № 1

सबसे पहले आपके पास पंक्ति 4 के लिए एक डफ मान है, वास्तव में आपके पास "नैन" स्ट्रिंग है जो "NaN" जैसा नहीं है, भले ही आपका कोड काम करता है, यह मान कभी नहीं बदला जाएगा।

तो आपको उस डफ वैल्यू को प्रतिस्थापित करने की आवश्यकता है और फिर आप लुकअप करने के लिए बस मानचित्र को कॉल कर सकते हैं NaN मान:

In [317]:

df.Age.replace("Nan", np.NaN, inplace=True)
df.loc[df["Age"].isnull(),"Age"] = df["Pclass"].map(df1.pclass_lookup)
df
Out[317]:
Pclass   Age
0       1    33
1       3    24
2       1    23
3       2  29.4
4       1  38.1

समय

5000 पंक्तियों के साथ एक डीएफ के लिए:

In [26]:

%timeit df.loc[df["Age"].isnull(),"Age"] = df["Pclass"].map(df1.pclass_lookup)
100 loops, best of 3: 2.41 ms per loop
In [27]:

%%timeit
def remove_na(x):
if pd.isnull(x["Age"]):
return df1[x["Pclass"]]
else:
return x["Age"]
df["Age"] =df.apply(remove_na, axis=1)
1 loops, best of 3: 278 ms per loop
In [28]:

%%timeit
nulls = df.loc[df.Age.isnull(), "Pclass"]
df.loc[df.Age.isnull(), "Age"] = df1.loc[nulls].values
100 loops, best of 3: 3.37 ms per loop

तो आप यहां देखते हैं कि यह लागू होता है क्योंकि यह पंक्ति के अनुसार स्केल को दो अन्य तरीकों की तुलना में कम खराब करता है, लेकिन वेक्टरिज्ड होते हैं लेकिन map अभी भी सबसे तेज है।


उत्तर № 2 के लिए 1

@ Vrajs5 की प्रतिक्रिया पर बिल्डिंग:

# Create dummy data
df = pd.DataFrame()
df["Pclass"] = [1,3,1,2,1]
df["Age"] = [33,24,23,None, None]
pclass_lookup = pd.Series([38.1,29.4,25.2], index = range(1,4))

# Solution:
nulls = df.loc[df.Age.isnull(), "Pclass"]
df.loc[df.Age.isnull(), "Age"] = pclass_lookup.loc[nulls].values

>>> df
Pclass   Age
0       1  33.0
1       3  24.0
2       1  23.0
3       2  29.4
4       1  38.1

जवाब के लिए 0 № 3

निम्नलिखित आपके लिए काम करना चाहिए:

df = pd.DataFrame()
df["Pclass"] = [1,3,1,2,1]
df["Age"] = [33,24,23,None, None]
df
Pclass  Age
0       1   33
1       3   24
2       1   23
3       2  NaN
4       1  NaN

pclass_lookup = pd.Series([38.1,29.4,25.2], index = range(1,4))
pclass_lookup
1    38.1
2    29.4
3    25.2
dtype: float64

def remove_na(x):
if pd.isnull(x["Age"]):
return pclass_lookup[x["Pclass"]]
else:
return x["Age"]
df["Age"] =df.apply(remove_na, axis=1)

Pclass   Age
0       1  33.0
1       3  24.0
2       1  23.0
3       2  29.4
4       1  38.1

संबंधित सवाल
सबसे लोकप्रिय