পান্ডাস গ্রুপ্বাইয়ের সাহায্যে বেশ কয়েকটি সারি থেকে স্ট্রিং কনেকেটেট করুন


92

আমি পান্ডে গ্রুপযুক্তের ভিত্তিতে ডেটাফ্রেমে কয়েকটি স্ট্রিং মার্জ করতে চাই।

এটি এখন পর্যন্ত আমার কোড:

import pandas as pd
from io import StringIO

data = StringIO("""
"name1","hej","2014-11-01"
"name1","du","2014-11-02"
"name1","aj","2014-12-01"
"name1","oj","2014-12-02"
"name2","fin","2014-11-01"
"name2","katt","2014-11-02"
"name2","mycket","2014-12-01"
"name2","lite","2014-12-01"
""")

# load string as stream into dataframe
df = pd.read_csv(data,header=0, names=["name","text","date"],parse_dates=[2])

# add column with month
df["month"] = df["date"].apply(lambda x: x.month)

আমি শেষ ফলাফলটি দেখতে দেখতে চাই:

এখানে চিত্র বর্ণনা লিখুন

আমি কীভাবে গ্রুপবাই ব্যবহার করতে পারি এবং "পাঠ্য" কলামে স্ট্রিংগুলিকে একরকম সাজানোর প্রয়োগ করতে পারি তা পাই না। কোন সাহায্য প্রশংসা!

উত্তর:


160

আপনি কলামগুলি 'name'এবং 'month'কলামগুলিতে গোষ্ঠীভুক্ত করতে পারেন , তারপরে কল করুন transformযা মূল ডিএফের সাথে প্রান্তিকৃত ডেটা ফেরত দেবে এবং একটি ল্যাম্বডা প্রয়োগ করবে যেখানে আমরা joinপাঠ্য প্রবেশ করান:

In [119]:

df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()
Out[119]:
    name         text  month
0  name1       hej,du     11
2  name1        aj,oj     12
4  name2     fin,katt     11
6  name2  mycket,lite     12

আমি df[['name','text','month']]এখানে আগ্রহী কলামগুলির একটি তালিকা পাস করে মূল ডিএফ উপস্থাপন করছি এবং তারপরে কল করবdrop_duplicates

সম্পাদনা করুন আমি কেবল কল করতে পারি applyএবং তারপরে reset_index:

In [124]:

df.groupby(['name','month'])['text'].apply(lambda x: ','.join(x)).reset_index()

Out[124]:
    name  month         text
0  name1     11       hej,du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

হালনাগাদ

lambdaএখানে অপ্রয়োজনীয়:

In[38]:
df.groupby(['name','month'])['text'].apply(','.join).reset_index()

Out[38]: 
    name  month         text
0  name1     11           du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

4
ইন pandas < 1.0, .drop_duplicates()সূচক উপেক্ষা করে, যা অপ্রত্যাশিত ফলাফল দিতে পারে। .agg(lambda x: ','.join(x))পরিবর্তে ব্যবহার করে আপনি এড়াতে পারেন .transform().drop_duplicates()
ম্যাথিয়াস ফ্রিপ

ঝরঝরে ও জটিল। বিশিষ্টভাবে দ্রুততরূপেও
রাঘাভান vmvs

drop_duplicates()আপনি যদি প্যারামিটারটি অন্তর্ভুক্ত না করেন drop_duplicates(inplace=True)বা কেবল কোডের লাইনটি পুনরায় df = df[['name','text','month']].drop_duplicates()
লিখন

44

আমরা 'নাম' এবং 'মাস' কলামগুলি গোষ্ঠীভুক্ত করতে পারি , তারপরে পান্ডার ডেটাফ্রেম অবজেক্টগুলির আগ্রাসন () ফাংশনগুলি কল করতে পারি।

আগ্রাসন () ফাংশন দ্বারা সরবরাহ করা সমষ্টি কার্যকারিতা এক গোষ্ঠীতে একাধিক পরিসংখ্যান গণনা করতে দেয়।

df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})

এখানে চিত্র বর্ণনা লিখুন


27

এডচামের উত্তর আপনাকে প্রচুর নমনীয়তা সরবরাহ করে তবে আপনি যদি কেবল তালিকার অবজেক্টের কলামে স্ট্রিংকে আঁকতে চান তবে আপনি এটি করতে পারেন:

output_series = df.groupby(['name','month'])['text'].apply(list)


মানুষ, তুমি আমাকে অনেক সময় বাঁচিয়েছ। ধন্যবাদ. আমার জানা 'রেজিস্ট্রেশন / ইউজার আইডির কালানুক্রমিক তালিকাগুলি একত্র করার সেরা উপায় এটি way আবার আপনাকে ধন্যবাদ.
অ্যালেক্স ফেদটোভ

5

আমার জন্য উপরের সমাধানগুলি খুব কাছাকাছি ছিল তবে কিছু অযাচিত / এন এবং টাইপ যুক্ত করেছে: অবজেক্ট, তাই এখানে একটি পরিবর্তিত সংস্করণ রয়েছে:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.