मेरे छोटे पेपर के लिए, मुझे आतंकवाद का नेटवर्क विश्लेषण करने की आवश्यकता है। इस विश्लेषण को करने के लिए मुझे पहले मौजूदा डेटा को अधिक सुखद रूप देना होगा। कार्य 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...
0
harryhow 8 जिंदा 2021, 23:54
मुझे आपके नमूना डेटा को अनुकूलित करने में अधिक समय लगा ताकि इसे df... ;-)
 – 
Pierre D
9 जिंदा 2021, 00:11
आपका बहुत बहुत धन्यवाद! लेकिन मैंने सीएसवी फ़ाइल संलग्न की, आह।
 – 
harryhow
9 जिंदा 2021, 00:19
अच्छा, इसे नहीं देखा था। भविष्य के संदर्भ के लिए, न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण बनाना बेहतर है: आप एक छोटा df भर सकते थे संक्षिप्त शब्दों के साथ 'foo', 'bar', आदि। यह हमेशा बेहतर होता है यदि आप चीजों को बहुत संक्षिप्त बना सकते हैं (लेकिन इतना संक्षिप्त नहीं कि आप जिस समस्या का प्रयास कर रहे हैं उसे खो दें हल है)।
 – 
Pierre D
9 जिंदा 2021, 00:25
"स्रोत" क्या है और "लक्ष्य" क्या है, और आप अंतर कैसे बता सकते हैं? आपके अपडेट किए गए उदाहरण में, 'A', 'B' और 'C' किसी भी कॉलम में दिखाई देते हैं। इसके अलावा: पंक्ति 0 नमूना आउटपुट में A, B और B, C दोनों में योगदान करती प्रतीत होती है। जानबूझकर? C, B और B, A भी क्यों नहीं? क्या ऐसा है कि आप सभी 2-संयोजन (gname, gname2 और gname2, gname3) चाहते हैं?
 – 
Pierre D
9 जिंदा 2021, 01:37
मैंने आपके मतलब का अनुमान लगाने की कोशिश की और उसी के अनुसार अपना जवाब अपडेट किया। हालांकि मुझे आपके नए "नमूना आउटपुट" के खिलाफ एक अंतर दिखाई देता है। C, A के मान 4, 2 क्यों होंगे? वे कहाँ से आते हैं? क्या आप वास्तव में सभी 2-क्रमपरिवर्तन चाहते हैं?
 – 
Pierre D
9 जिंदा 2021, 01:51

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'})

1
Pierre D 9 जिंदा 2021, 02:10
मुझे दो कॉलम के लिए एकत्रित करने की आवश्यकता है, तीन नहीं। पता नहीं कैसे समझाऊं। एक स्रोत और लक्ष्य कॉलम होना चाहिए। यह एक कठिन हिस्सा है जिसे मैं नहीं जानता कि कैसे हासिल किया जाए। तो gname1 gname2 gname3 केवल स्रोत और लक्ष्य कॉलम में कनवर्ट करें। नेटवर्क विश्लेषण के लिए यह आवश्यक है क्योंकि नोड्स को केवल दो कॉलम के संबंध में जोड़ा जाना चाहिए, मुझे लगता है। आउटपुट उदाहरण से पता चलता है कि मैं हासिल करना चाहता हूं।
 – 
harryhow
9 जिंदा 2021, 00:48
पोस्ट में जोड़ा गया सरल उदाहरण
 – 
harryhow
9 जिंदा 2021, 00:51
क्या gname2 और gname3 में रिक्त मानों के साथ gname भी शामिल करने का कोई तरीका है? लक्ष्य के लिए मूल्य स्रोत के मूल्य के समान होगा। इसलिए: यदि gname2 खाली है, लेकिन gname खाली नहीं है, तो स्रोत और लक्ष्य gname मान होगा। उदा: pastebin.com/ZzdcerbV
 – 
harryhow
10 जिंदा 2021, 22:52