পান্ডাস ফিলেনা () এর আর্গুমেন্ট হিসাবে কীভাবে অন্য একটি সম্পূর্ণ কলামটি পাস করবেন


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একটি সিরিজ লাগে।
অমি ট্যাভরি

4
ধন্যবাদ! আমি ভেবেছিলাম সিরিয়াকে এনএ মানগুলির সংখ্যার সঠিক আকার হতে হবে।
xav

এটি বহুবিধ সারিগুলির ডেটাফ্রেমগুলির জন্যও কাজ করে। ফিল্নার সেই বৈশিষ্ট্যটি খুব সহায়ক।
ওয়ারটিকাল

19

আপনি করতে পারেন

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

আরএইচএসের সামগ্রিক নির্মাণে কুকবুক (যা এটি কোনও অবস্থাতেই পড়তে অর্থ প্রদান করে) থেকে তিনটি প্যাটার্নpandas ব্যবহার করে । এটির ভেক্টর সংস্করণ a? b: c


এই সমস্যার জন্য আমি যে সমাধানটি ব্যবহার করেছি তা নয় বরং খুব আকর্ষণীয় প্যাটার্ন! ধন্যবাদ!
xav

একাধিক কলামের জন্য এটি ব্যবহার করার কোনও উপায় আছে? উদাহরণস্বরূপ যদি এই ডিএফের মধ্যে cat1, cat2, cat3, cat4, cat5 ছিল এবং ধরা যাক cat5 খালি ছিল। cat1 থেকে মানগুলি দিয়ে cat5 পূরণ করার কোনও উপায় আছে যদি cat1 খালি থাকে তবে cat2, cat2 খালি থাকলে cat3 ইত্যাদি?
ব্যবহারকারী 8322222

@ ইউজার 22২২২২২২ আমি অবশ্যই দেরি করেছি তবে কারও কাছে যদি এই প্রশ্ন থাকে তবে আপনি এনএসপি কোথাও নীস্ট করতে পারবেন, ঠিক যেমন আপনি এক্সেল সেল = এনপি.হোরে (কনড, ভ্যাল_ট্রু, এনপি.হেন) (কনড, ভ্যাল_ট্রু, ভাল_ফালস) করতে পারেন, )।
কায়সার

আপনি উল্লেখ করতে চান যে এটি কেবল অন্তর্নির্মিত প্যান্ডাসকে নতুন সংজ্ঞা দিচ্ছে pd.DataFrame.fillna()। এবং আমি সন্দেহ করি যে কর্নার-কেস আচরণের জন্য পৃথক ডেটাফ্রেমগুলি থেকে মিলিত সিরিজের দৈর্ঘ্যের জন্য পৃথক হতে পারে: ডিএফএ ['ক্যাট 1'], ডিএফবি ['ক্যাট 2']
স্মি

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

আশা করি এটি কারও সহায়ক হবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.