পান্ডা ব্যবহার করে দুটি কলামের তুলনা করুন


104

এটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করে:

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

Out[8]: 
  one  two three
0   10  1.2   4.2
1   15  70   0.03
2    8   5     0

আমি ifপান্ডসের মধ্যে বিবৃতি জাতীয় কিছু ব্যবহার করতে চাই ।

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

মূলত, প্রতিটি সারির মাধ্যমে পরীক্ষা করুন if স্টেটমেন্টের , নতুন কলাম তৈরি করুন।

দস্তাবেজগুলি ব্যবহার করতে বলেছে .allতবে এর কোনও উদাহরণ নেই ...


ifবিবৃতি হলে মানটি কী হওয়া উচিত False?
অ্যালেক্স রিলি

4
@ মেরলিন: যদি আপনার একটি কলামে সংখ্যাসূচক তথ্য থাকে, তবে এটি স্ট্রিংয়ের সাথে না মেশাই ভাল। এটি করার ফলে কলামের টাইপটি পরিবর্তিত হয় object। এটি নির্বিচারে পাইথন অবজেক্টগুলিকে কলামে সংরক্ষণ করার অনুমতি দেয় তবে এটি ধীর সংখ্যার গণনার ব্যয়ে আসে। সুতরাং কলামটি যদি সংখ্যাসূচক তথ্য সংরক্ষণ করে, নন-অ-সংখ্যার জন্য NaN ব্যবহার করা ভাল।
unutbu

4
স্ট্রিং হিসাবে ইন্টিজার হচ্ছে এবং তাদের উপর তুলনা করার চেষ্টা বিজোড় দেখায়: a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]। এটি "সঠিক" কোড সহ বিভ্রান্তিকর ফলাফল তৈরি করে: প্রথম লাইনের জন্য df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])] ফলন 10দেয়, তবে ফলাফলটি দেওয়া উচিত NaNযদি ইনপুটটি পূর্ণসংখ্যা হত।
প্রাইমার

উত্তর:


147

আপনি এনপি.হোহার ব্যবহার করতে পারেন । যদি condকোনও বুলিয়ান অ্যারে হয় Aএবং Bযদি অ্যারে হয় তবে

C = np.where(cond, A, B)

সি Aযেখানে condসত্য, এবং Bকোথায় condমিথ্যা তার সমান হতে সংজ্ঞায়িত করে ।

import numpy as np
import pandas as pd

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
                     , df['one'], np.nan)

উৎপাদনের

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

আপনার যদি একাধিক শর্ত থাকে তবে তার পরিবর্তে আপনি np.select ব্যবহার করতে পারেন । উদাহরণস্বরূপ, যদি আপনি চান df['que']সমান df['two']যখন df['one'] < df['two'], তারপর

conditions = [
    (df['one'] >= df['two']) & (df['one'] <= df['three']), 
    df['one'] < df['two']]

choices = [df['one'], df['two']]

df['que'] = np.select(conditions, choices, default=np.nan)

উৎপাদনের

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03   70
2   8    5     0  NaN

যদি আমরা ধরে নিতে পারি যে df['one'] >= df['two']কখন df['one'] < df['two']মিথ্যা, তবে শর্ত এবং পছন্দগুলি সরল করা যেতে পারে

conditions = [
    df['one'] < df['two'],
    df['one'] <= df['three']]

choices = [df['two'], df['one']]

( এনএএন থাকলে df['one']বা ধরে নেওয়া অনুমানটি সত্য নাও হতে df['two']পারে))


মনে রাখবেন যে

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

স্ট্রিং মান সহ একটি ডেটা ফ্রেম সংজ্ঞায়িত করে। যেহেতু এগুলি সংখ্যাসূচক দেখাচ্ছে, আপনি সেই স্ট্রিংগুলিকে ফ্লোটে রূপান্তর করা থেকে ভাল:

df2 = df.astype(float)

স্ট্রিংগুলি চরিত্র অনুসারে চরিত্রের তুলনা করে, যদিও ফ্লোটগুলি সংখ্যার সাথে তুলনা করা হয়, এর ফলে ফলাফলগুলি পরিবর্তন হয়।

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False

73

আপনি .equalsকলাম বা পুরো ডেটা ফ্রেমের জন্য ব্যবহার করতে পারেন ।

df['col1'].equals(df['col2'])

তারা সমান হলে, বিবৃতি ফিরে আসবে True, অন্যথায় False


22
দ্রষ্টব্য: এটি কেবল পুরো কলামটিকে অন্য একটি সাথে তুলনা করে। এটি কলম্বন উপাদান অনুসারে তুলনা করে না
গেরদা

4
আপনি যদি দেখতে চান যে একটি কলামের সর্বদা "কলা" এর চেয়ে বড় "বা অন্য কলামগুলির চেয়ে" কম "আছে কিনা?
rrlamichhane

28

আপনি প্রয়োগ () ব্যবহার করতে পারেন এবং এরকম কিছু করতে পারেন

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

অথবা আপনি যদি ল্যাম্বডা ব্যবহার না করা পছন্দ করেন

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    return ''
df['que'] = df.apply(que, axis=1)

4
আমার সন্দেহ হয় এটি পোস্ট করা অন্যান্য পদ্ধতির তুলনায় এটি সম্ভবত কিছুটা ধীর।, যেহেতু এটি পান্ডাস দ্বারা অনুমোদিত ভেক্টরাইজড ক্রিয়াকলাপগুলির সুবিধা নেয় না।
মারিয়াস

@ বোবিহাফনার: লম্বদা যখন / তারপরে / অন্য বিবৃতিগুলি জটিল ব্যবহার করা হয় তখন পঠনযোগ্য নয়।
মার্লিন

@ মেরলিন আপনি অন্য একটি যোগ করতে পারেন এবং আমি ল্যাম্বডাস এবং একাধিক শর্তে আপনার সাথে একমত হব
বব হাফনার

নন ল্যাম্বডা ফাংশনটি সাধারণ করার কোনও উপায় আছে যাতে আপনি ডেটাফ্রেম কলামগুলিতে প্রবেশ করতে পারবেন, এবং নামটি পরিবর্তন করবেন না?
আজাহা

@ আজো আপনি এই ডিএফ এর মতো আইলোক দিয়ে সাধারণীকরণ করতে পারেন ['কুই'] = ডিএফ.প্লাই (ল্যাম্বডা x: x.iloc [0] যদি x.iloc [0]> = x.iloc [1] এবং x.iloc [0 ] <= x.iloc [2] অন্য "", অক্ষ = 1) আপনার অর্থ কি এটি? স্পষ্টতই। আপনার কলামগুলির ক্রমের বিষয়টি
বব হাফনার

9

একটি উপায় হ'ল কলামটি সূচী করতে বুলিয়ান সিরিজ ব্যবহার করা df['one']। এটি আপনাকে একটি নতুন কলাম দেয় যেখানে Trueপ্রবেশগুলিতে একই সারির সমান মান df['one']এবং Falseমানগুলি থাকেNaN

বুলিয়ান সিরিজটি কেবলমাত্র আপনার ifবিবৃতি দিয়ে দেওয়া হয়েছে (যদিও এটির &পরিবর্তে এটি ব্যবহার করা প্রয়োজন and):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

আপনি যদি NaNমানগুলি অন্য মান দ্বারা প্রতিস্থাপন করতে চান তবে আপনি fillnaনতুন কলামে পদ্ধতিটি ব্যবহার করতে পারেন que। আমি 0এখানে খালি স্ট্রিংয়ের পরিবর্তে ব্যবহার করেছি :

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0

4

প্রতিটি পৃথক শর্তকে প্রথম বন্ধনে আবদ্ধ করুন এবং তারপরে &শর্তগুলি একত্রিত করতে অপারেটরটি ব্যবহার করুন :

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

~ম্যাচটি উল্টানোর জন্য আপনি কেবল ("না" অপারেটর) ব্যবহার করে অনাবিল সারিগুলি পূরণ করতে পারেন :

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

আপনি ব্যবহার করতে হবে &এবং ~বদলে andএবং notকারণ &এবং ~অপারেটরদের কাজ উপাদান-বাই-উপাদান।

চূড়ান্ত ফলাফল:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  

1

ব্যবহার করুন np.selectআপনি যদি একাধিক শর্ত একটি ভিন্ন কলামে dataframe এবং আউটপুট একটি নির্দিষ্ট পছন্দ থেকে চেক করা আছে

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

দ্রষ্টব্য: শর্তাবলীর কোনও নয় এবং পছন্দগুলির সাথে কোনওটিই মিলবে না, দুটি ভিন্ন শর্তের জন্য যদি আপনার একই পছন্দ থাকে তবে পছন্দ মতো পাঠ্যের পুনরাবৃত্তি করুন


0

আমি মনে করি ওপির অন্তর্নিহিতের নিকটতমতমটি যদি বিবৃতিটি হয় তবে একটি ইনলাইন:

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 

আপনার কোডটি আমাকে ত্রুটি দেয়df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing
ভ্যাসিলি 111
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.