मेरे छोटे पेपर के लिए, मुझे आतंकवाद का नेटवर्क विश्लेषण करने की आवश्यकता है। इस विश्लेषण को करने के लिए मुझे पहले मौजूदा डेटा को अधिक सुखद रूप देना होगा। कार्य gname, gname2, gname3
पर nkill
के योग के साथ एकत्रीकरण करना है और n_attacks
के कॉलम में प्रति वर्ष समान हमलों की गणना करना है। इसलिए यदि एक ही वर्ष में एक ही समूह द्वारा दो घटनाएँ n_attacks
की दुगुनी होती हैं, तो 2 होगी।
डेटा डालें
| | iyear | gname | gname2 | gname3 | nkill |
|---:|--------:|:-------------------------------------------------------------|:------------------------------------------|:------------------------------------------|--------:|
| 0 | 2017 | Lashkar-e-Jhangvi | Tehrik-i-Taliban Pakistan (TTP) | Aalmi Majlis-i-Tahfuz-i-Khatam-i-Nubuwaat | 1 |
| 1 | 2010 | Indian Mujahideen | Students Islamic Movement of India (SIMI) | 313 Brigade | 17 |
| 2 | 2011 | Zeliangrong United Front | Zeliangrong United Front | nan | 7 |
| 3 | 2015 | National Socialist Council of Nagaland-Khaplang (NSCN-K) | Zeliangrong United Front | nan | 2 |
| 4 | 2008 | Communist Party of Nepal- Unified Marxist-Leninist (CPN-UML) | Young Communist League | nan | 1 |
| 5 | 2015 | Abu Sayyaf Group (ASG) | Waning Abdusalam Group (WAG) | nan | 4 |
| 6 | 2015 | Abu Sayyaf Group (ASG) | Waning Abdusalam Group (WAG) | nan | 6 |
| 7 | 2015 | Baba Ladla Gang | Uzair Baloch Gang | nan | 7 |
| 8 | 2014 | Taliban | Tehrik-i-Taliban Pakistan (TTP) | nan | 24 |
उदाहरण आउटपुट
| | iyear | source | target | nkill | n_attacks |
|---:|--------:|:-------------------------------------------------------------|:------------------------------------------|--------:|------------:|
| 0 | 2017 | Lashkar-e-Jhangvi | Tehrik-i-Taliban Pakistan (TTP) | 1 | 1 |
| 1 | 2010 | Indian Mujahideen | Students Islamic Movement of India (SIMI) | 17 | 1 |
| 2 | 2011 | Zeliangrong United Front | Zeliangrong United Front | 7 | 1 |
| 3 | 2015 | National Socialist Council of Nagaland-Khaplang (NSCN-K) | Zeliangrong United Front | 2 | 1 |
| 4 | 2008 | Communist Party of Nepal- Unified Marxist-Leninist (CPN-UML) | Young Communist League | 1 | 1 |
| 5 | 2015 | Abu Sayyaf Group (ASG) | Waning Abdusalam Group (WAG) | 10 | 2 |
| 6 | 2015 | Baba Ladla Gang | Uzair Baloch Gang | 7 | 1 |
| 7 | 2014 | Taliban | Tehrik-i-Taliban Pakistan (TTP) | 24 | 1 |
| 8 | 2017 | Aalmi Majlis-i-Tahfuz-i-Khatam-i-Nubuwaat | Lashkar-e-Jhangvi | 1 | 1 |
| 9 | 2017 | Aalmi Majlis-i-Tahfuz-i-Khatam-i-Nubuwaat | Tehrik-i-Taliban Pakistan (TTP) | 1 | 1 |
| 10 | 2010 | 313 Brigade | Students Islamic Movement of India (SIMI) | 17 | 1 |
| 11 | 2010 | 313 Brigade | Indian Mujahideen | 17 | 1 |
जहां
iyear = घटना का वर्ष;
स्रोत = स्रोत आतंकवादी समूह;
लक्ष्य = सहयोगी आतंकवादी समूह;
nkill = आतंकवादी हमले में पीड़ितों की संख्या;
n_attacks = उसी में स्रोत और लक्ष्य द्वारा किए गए हमलों की संख्या वर्ष।
समस्या यह है कि मुझे नहीं पता कि पंडों का उपयोग करके इस तरह का ऑपरेशन कैसे किया जाता है। मैंने सिर्फ लूप और अर्ध-मैन्युअल रूप से एकत्रीकरण करने के बारे में सोचा, लेकिन ईमानदारी से मुझे नहीं पता। कोई सुझाव या कोड स्निपेट सहायक होगा। धन्यवाद।
यूपीडी: पुनरुत्पादित उदाहरण
| | year | gname | gname2 | gname3 | nkill |
|---:|-------:|:--------|:---------|:---------|--------:|
| 0 | 1991 | A | B | C | 3 |
| 1 | 1991 | C | A | nan | 1 |
| 2 | 1991 | B | C | nan | 2 |
| 3 | 1991 | D | A | B | 5 |
नमूना आउटपुट
year | source | target | nkill | n_attacks
1991 | A | B | 8 | 2
1991 | B | C | 5 | 2
1991 | C | A | 4 | 2
1991 | D | A | 5 | 1
etc...
1 उत्तर
अपडेट किए गए प्रश्न के आधार पर संशोधित उत्तर
ठीक है, नमूना डेटा के साथ अद्यतन उदाहरण के आधार पर, मुझे अंततः पता चला कि ओपी क्या चाहता था: सभी 3 gname
कॉलम का 2-क्रमपरिवर्तन।
from itertools import permutations
combos = [{x: 'source', y: 'target', z: 'ignored'} for x, y, z in permutations('gname gname2 gname3'.split())]
out = pd.concat([df.rename(columns=mapper) for mapper in combos]).groupby(
['iyear', 'source', 'target']
)['nkill'].agg([sum, 'count']).rename(
columns={'sum':'nkill', 'count':'n_attacks'})
परिणाम (out
) छोटे नमूना इनपुट पर:
nkill n_attacks
iyear source target
1991 A B 8 2
C 4 2
D 5 1
B A 8 2
C 5 2
D 5 1
C A 4 2
B 5 2
D A 5 1
B 5 1
(शुद्धवादियों के लिए ध्यान दें: अधिक सटीक ... for x, y in permutations(..., r=2)
क्यों नहीं? क्योंकि तब हम एक gname
कॉलम का नाम नहीं बदलेंगे, और concat
शेष के साथ गड़बड़ हो जाएगा gname
कॉलम बचे हैं -- यह बिल्कुल वैसा ही काम करेगा, लेकिन concat
बड़ा है)।
प्रारंभिक उत्तर (प्रारंभिक प्रश्न के लिए...)
ये कोशिश करें:
df.fillna('').groupby(
'iyear gname gname2 gname3'.split()
)['nkill'].agg([sum, 'count'])
आउटपुट:
sum count
iyear gname gname2 gname3
2008 Communist Party o... Young Communist L... 1 1
2010 Indian Mujahideen Students Islamic ... 313 Brigade 17 1
2011 Zeliangrong Unite... Zeliangrong Unite... 7 1
2014 Taliban Tehrik-i-Taliban ... 24 1
2015 Abu Sayyaf Group ... Waning Abdusalam ... 10 2
Baba Ladla Gang Uzair Baloch Gang 7 1
National Socialis... Zeliangrong Unite... 2 1
2017 Lashkar-e-Jhangvi Tehrik-i-Taliban ... Aalmi Majlis-i-Ta... 1 1
स्पष्टीकरण:
.fillna('')
इसलिए है क्योंकि आपके अन्यथा टेक्स्ट कॉलम में NaN हैं;groupby(...)
केवल वही व्यक्त कर रहा है जो आप चाहते थे;.agg()
एक या अधिक स्तंभों पर एकाधिक एकत्रीकरण स्वीकार करता है।
पीएस: बीटीडब्लू, आप कॉलम को अपने सटीक चश्मे में बदल सकते हैं, जैसा कि आप निश्चित रूप से जानते हैं: .rename(columns={'sum':'nkill', 'count':'n_attacks'})
।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
df
... ;-)df
भर सकते थे संक्षिप्त शब्दों के साथ'foo'
,'bar'
, आदि। यह हमेशा बेहतर होता है यदि आप चीजों को बहुत संक्षिप्त बना सकते हैं (लेकिन इतना संक्षिप्त नहीं कि आप जिस समस्या का प्रयास कर रहे हैं उसे खो दें हल है)।'A'
,'B'
और'C'
किसी भी कॉलम में दिखाई देते हैं। इसके अलावा: पंक्ति 0 नमूना आउटपुट मेंA, B
औरB, C
दोनों में योगदान करती प्रतीत होती है। जानबूझकर?C, B
औरB, A
भी क्यों नहीं? क्या ऐसा है कि आप सभी 2-संयोजन (gname, gname2
औरgname2, gname3
) चाहते हैं?C, A
के मान4, 2
क्यों होंगे? वे कहाँ से आते हैं? क्या आप वास्तव में सभी 2-क्रमपरिवर्तन चाहते हैं?