পান্ডাস মার্জ - কলামগুলি নকল করে কীভাবে এড়ানো যায়


93

আমি দুটি ডেটা ফ্রেমের মধ্যে একীকরণের চেষ্টা করছি। প্রতিটি ডেটা ফ্রেমের দুটি সূচকের স্তর থাকে (তারিখ, কুসিপ)। কলামগুলিতে, কয়েকটি কলাম উদাহরণস্বরূপ দুটি (মুদ্রা, অ্যাড তারিখ) এর মধ্যে মিলছে।

এগুলি সূচক দ্বারা মার্জ করার সর্বোত্তম উপায় কী, তবে দুটি অনুলিপি মুদ্রা এবং পরবর্তী তারিখ না নেওয়া।

প্রতিটি ডেটা ফ্রেম 90 টি কলাম, তাই আমি হাত দিয়ে সমস্ত কিছু লেখা এড়াতে চেষ্টা করছি।

df:                 currency  adj_date   data_col1 ...
date        cusip
2012-01-01  XSDP      USD      2012-01-03   0.45
...

df2:                currency  adj_date   data_col2 ...
date        cusip
2012-01-01  XSDP      USD      2012-01-03   0.45
...

যদি আমি করি:

dfNew = merge(df, df2, left_index=True, right_index=True, how='outer')

আমি পাই

dfNew:              currency_x  adj_date_x   data_col2 ... currency_y adj_date_y
date        cusip
2012-01-01  XSDP      USD      2012-01-03   0.45             USD         2012-01-03

ধন্যবাদ! ...

উত্তর:


143

আপনি কেবল একটি ডেটাফ্রেমে থাকা কলামগুলি নিয়ে কাজ করতে পারেন এবং মার্জটিতে কলামগুলির একটি উপসেট নির্বাচন করতে এটি ব্যবহার করতে পারেন।

cols_to_use = df2.columns.difference(df.columns)

তারপরে মার্জটি সম্পাদন করুন (নোট করুন এটি একটি সূচক বস্তু তবে এটির একটি সহজ tolist()পদ্ধতি আছে)।

dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')

এটি মার্জটিতে সংঘর্ষের কোনও কলাম এড়াবে।


কী যদি কীটি একটি কলাম হয় এবং এটিকে একই বলা হয়? এটি প্রথম পদক্ষেপের সাথে বাদ পড়বে।
গেরেরা

তোমাকে অনেক ধন্যবাদ!!!
মেঘলা_গ্রাইন

88

আমি suffixesবিকল্পটি এতে ব্যবহার করি .merge():

dfNew = df.merge(df2, left_index=True, right_index=True,
                 how='outer', suffixes=('', '_y'))
dfNew.drop(dfNew.filter(regex='_y$').columns.tolist(),axis=1, inplace=True)

ধন্যবাদ @ আইজোসেফ


15
এটির জন্য কোড অন্তর্ভুক্ত থাকলে এটি আরও সহায়ক উত্তর হতে পারে filter(যা মোটামুটি সহজবোধ্য, তবুও সময়সংশ্লিষ্ট / স্মরণে ত্রুটি-প্রবণ দেখতে) look যেমন dfNew.drop(list(dfNew.filter(regex='_y$')), axis=1, inplace=True)
আইজোসেফ

5

আমি পান্ডাদের সাথে নতুনভাবে নতুন কিন্তু আমি একই জিনিস অর্জন করতে চেয়েছিলাম, _x বা _y এর সাথে স্বয়ংক্রিয়ভাবে কলামের নামগুলি এড়ানো এবং সদৃশ ডেটা মুছে ফেলতে চাই। পরিশেষে আমি এই ব্যবহার করে এটি করেনি উত্তর এবং এই এক Stackoverflow থেকে

বিক্রয়.csv

    শহর; রাষ্ট্র; ইউনিট
    মেন্ডোসিনো; সিএ; ১
    ডেনভার; সিও; 4
    অস্টিন; টিএক্স; 2

महसूल.সিএসভি

    শাখা_আইডি; শহর; আয়; রাজ্য_আইডি
    10; অস্টিন; 100; টিএক্স
    20; অস্টিন; 83; টিএক্স
    30; অস্টিন; 4; টিএক্স
    47; অস্টিন; 200; টিএক্স
    20; ডেনভার; 83; সিও
    30; স্প্রিংফিল্ড; 4; আই

মার্জ.পি আমদানি পান্ডা

def drop_y(df):
    # list comprehension of the cols that end with '_y'
    to_drop = [x for x in df if x.endswith('_y')]
    df.drop(to_drop, axis=1, inplace=True)


sales = pandas.read_csv('data/sales.csv', delimiter=';')
revenue = pandas.read_csv('data/revenue.csv', delimiter=';')

result = pandas.merge(sales, revenue,  how='inner', left_on=['state'], right_on=['state_id'], suffixes=('', '_y'))
drop_y(result)
result.to_csv('results/output.csv', index=True, index_label='id', sep=';')

মার্জ কমান্ড কার্যকর করার সময় আমি _xপ্রত্যয়টি একটি খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করি এবং সেগুলি দিয়ে আমি শেষ হওয়া কলামগুলি সরিয়ে ফেলতে পারি_y

আউটপুট.সিএসভি

    আইডি; শহর; রাষ্ট্র; ইউনিট; শাখা_আইডি; উপার্জন; রাষ্ট্র_আইডি
    0; ডেনভার; সিও; 4; 20; 83; সিও
    1; অস্টিন; টিএক্স; 2; 10; 100; টিএক্স
    2; অস্টিন; টিএক্স; 2; 20; 83; টিএক্স
    3; অস্টিন; টিএক্স; 2; 30; 4; টিএক্স
    4; অস্টিন; টিএক্স; 2; 47; 200; টিএক্স

4

@ আরপিগ্রোগের উত্তরে বিল্ডিং, আপনি প্রত্যয়টির বিভিন্ন টুকরো এবং ফিল্টার ধাপটিকে এক রেখায় একটি নেতিবাচক রেজেক্স ব্যবহার করে একত্রিত করতে পারেন:

dfNew = df.merge(df2, left_index=True, right_index=True,
             how='outer', suffixes=('', '_DROP')).filter(regex='^(?!.*_DROP)')

বা ব্যবহার df.join:

dfNew = df.join(df2),lsuffix="DROP").filter(regex="^(?!.*DROP)")

এখানে রেজেক্স এমন কোনও কিছু রক্ষা করছে যা "DROP" শব্দের সাথে শেষ না হয় , সুতরাং কলামগুলির মধ্যে ইতিমধ্যে উপস্থিত না হওয়া একটি প্রত্যয় ব্যবহার নিশ্চিত করে নিন।

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