मेरे पास निम्न डेटा फ़्रेम है जो कर्मचारी संख्या का प्रतिनिधित्व करता है, वे विभाग हैं और कंपनी में उनका रोल कोड "1" या "2" हो सकता है। कॉलम "विभाग का नाम" पर आपके पास या तो विभाग हो सकता है जिसमें कर्मचारी की भूमिका होती है (नामकरण सम्मेलन "एक्सएक्स: विभाग का नाम" जहां एक्सएक्स देश कोड है) या, यदि कर्मचारी की पूरे देश के लिए वह भूमिका है, तो इसके बजाय विभाग के नाम से आपको उस देश का नाम मिलेगा जिसमें कर्मचारी की भूमिका है। डेटा फ्रेम इस तरह दिखेगा:

  Department Name     Employee Number      Role Code   
0  AU:Dept1               1000                     1
1  All Australia          1000                     2
2  AU:Dept7               1000                     1
4  CZ:Dept3               1001                     2
5  CZ:Dept3               1001                     1
6  CZ:Dept4               1001                     1 
7  All Poland             1002                     1
8  PL:Dept1               1002                     2
9  PL:Dept2               1002                     1
10 ES:Dept1               1002                     2
11 All Singapore          1003                     1
12 All Singapore          1003                     2

कर्मचारियों के पास प्रत्येक अद्वितीय विभाग के नाम में या तो केवल भूमिका 1 या भूमिका 2 हो सकती है और, यदि भूमिका पूरे देश के लिए है, तो इसका मतलब है कि इस व्यक्ति की उस देश के सभी विभागों की भूमिका है। फिर भी, जैसा कि आप नमूने में देख सकते हैं, हमारे पास ऐसे कर्मचारी हो सकते हैं जिनके पास डेटाबेस में "सभी देश" की भूमिका हो, लेकिन उस देश के एक विशिष्ट विभाग को भी (उदाहरण के लिए "ऑल पोलैंड" के लिए एक भूमिका 1 लेकिन यह भी एक पोलैंड में एक विभाग के लिए भूमिका १ जैसा कि आप उदाहरण देख सकते हैं, जो बेमानी होगा और इसे ध्वजांकित भी किया जाना चाहिए)।

मुझे एक कोड बनाने की ज़रूरत है जो कर्मचारी संख्या की पंक्तियों को वापस कर दे:

  • एक ही विभाग में भूमिका १ और भूमिका २
  • भूमिका १ और भूमिका २ पूरे देश के लिए
  • पूरे देश के लिए भूमिका १ और उस देश के किसी भी विभाग में भूमिका २
  • पूरे देश के लिए भूमिका २ और उस देश के किसी भी विभाग में भूमिका १

इस मामले में, आउटपुट इस तरह दिखेगा (सभी आपत्तिजनक पंक्तियों को लौटाते हुए)

  Department Name     Employee Number      Role Code   
0  AU:Dept1               1000                     1
1  All Australia          1000                     2
2  AU:Dept7               1000                     1
4  CZ:Dept3               1001                     2
5  CZ:Dept3               1001                     1
7  All Poland             1002                     1
8  PL:Dept1               1002                     2
9  PL:Dept2               1002                     1
11 All Singapore          1003                     1
12 All Singapore          1003                     2

ऐसा करने का सबसे अच्छा तरीका क्या होगा?

-1
Paulo Cortez 24 सितंबर 2020, 16:27

1 उत्तर

सबसे बढ़िया उत्तर

आप देश और विभाग को विभाजित करके नए कॉलम बना सकते हैं। फिर नियमों को बूलियन मास्क के संयोजन के साथ लागू किया जा सकता है, लेकिन दूसरा भाग काफी जटिल है... टिप्पणियों का पालन करें।

import pycountry

### double roles for same department
# (treat 'all <country>' as just another department)
m1 = (
    df.groupby(['Department_Name', 'Employee_Number'])
    .transform('count').squeeze()
    > 1
)

### mismatched roles for the entire country and at least one department

# split country codes and department names
df[['country_code', 'dept']] = [
    [pycountry.countries.get(name=dn.split()[1]).alpha_2, 'All']
    if dn.startswith('All') else dn.split(':')
    for dn in df['Department_Name'].to_list()
]

# return all rows for each country-employee if a flag is found
flag = []
for (cc, en), g in df.groupby(['country_code', 'Employee_Number']):
    subroles = g.loc[g['dept'].ne('All'), 'Role_Code'].to_list()
    for rc in g.loc[g['dept'].eq('All'), 'Role_Code']:
        other = 1 if rc==2 else 2
        if other in subroles:
            flag.append([cc, en, True])
            break

# combine both rules        
df = df.merge(
    pd.DataFrame(flag, columns=['country_code', 'Employee_Number', 'flag']),
    how='left', on=['country_code', 'Employee_Number']
)
flag = df.pop('flag')
flag = flag.where(flag, m1)

इसे इस रूप में प्रयोग करें

df_out = df[flag]
print(df_out)

   Department_Name  Employee_Number  Role_Code country_code   dept
0         AU:Dept1             1000          1           AU  Dept1
1    All Australia             1000          2           AU    All
2         AU:Dept7             1000          1           AU  Dept7
3         CZ:Dept3             1001          2           CZ  Dept3
4         CZ:Dept3             1001          1           CZ  Dept3
6       All Poland             1002          1           PL    All
7         PL:Dept1             1002          2           PL  Dept1
8         PL:Dept2             1002          1           PL  Dept2
10   All Singapore             1003          1           SG    All
11   All Singapore             1003          2           SG    All
0
RichieV 24 सितंबर 2020, 19:44