पंडों के समूह का उपयोग करते हुए कई पंक्तियों से तार को समेटना


100

मैं पंडों में एक समूह के आधार पर एक डेटाफ्रेम में कई तार मिलाना चाहता हूं।

यह मेरा अब तक का कोड है:

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)

मैं चाहता हूं कि अंतिम परिणाम इस तरह दिखे:

यहां छवि विवरण दर्ज करें

मुझे नहीं पता कि मैं किस तरह से ग्रुपबी का उपयोग कर सकता हूं और कॉलम "टेक्स्ट" में स्ट्रिंग्स के कुछ प्रकार के संयोजन को लागू कर सकता हूं। किसी भी मदद की सराहना की!

जवाबों:


177

आप समूह 'name'और 'month'कॉलम कर सकते हैं, फिर कॉल करें transformजो डेटा को मूल df से संरेखित करेगा और एक लैम्ब्डा लागू करेगा जहाँ हम 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']]यहाँ ब्याज के स्तंभों की एक सूची को पास करके मूल df को प्रस्तुत करता हूं और फिर कॉल करता हूं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

1
में 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()
IAmBotmaker

49

हम कर सकते हैं GroupBy , 'नाम' और 'माह' कॉलम तो agg फोन () के पांडा का DataFrame वस्तुओं कार्य करता है।

एग () फ़ंक्शन द्वारा प्रदान की गई एकत्रीकरण कार्यक्षमता एक गणना में प्रत्येक समूह में कई आंकड़ों की गणना करने की अनुमति देती है।

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

यहां छवि विवरण दर्ज करें


28

EdChum द्वारा उत्तर आपको बहुत अधिक लचीलापन प्रदान करता है लेकिन यदि आप सूची वस्तुओं के एक स्तंभ में तार को समाप्‍त करना चाहते हैं तो आप भी कर सकते हैं:

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


यार, तुमने अभी बहुत समय बचाया है। धन्यवाद। यह उन पंजीकरणों / उपयोगकर्ता आईडी के कालानुक्रमिक सूचियों को इकट्ठा करने का सबसे अच्छा तरीका है, जिन्हें मैं जानता हूं। एक बार फिर आपका धन्यवाद।
एलेक्स फेडोटोव

6

मेरे लिए उपरोक्त समाधान करीब थे लेकिन कुछ अवांछित / n और dtype जोड़े गए: ऑब्जेक्ट, इसलिए यहां एक संशोधित संस्करण है:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()

-1

यदि आप किसी सूची में अपना "पाठ" जोड़ना चाहते हैं:

df.groupby(['name', 'month'], as_index = False).agg({'text': list})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.