कैसे पंडों में एक शर्त के आधार पर प्रत्येक पंक्ति के लिए एक अलग सबस्ट्रिंग जोड़ सकते हैं?

यहाँ एक डमी डेटाफ़्रेम है जिसे मैंने बनाया है:

import numpy as np
import pandas as pd
np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,5,size=(5, 2)))
df.columns = ['A','B']

यदि मैं उन पंक्तियों के लिए B में एक स्ट्रिंग YYYY के साथ पंक्तियों को प्रतिस्थापित करता हूं, जिनका मान A में 5 से कम है, तो मैं इसे इस तरह से करूंगा:

df.loc[df['A'] < 2, 'B'] = 'YYYY'

यह मूल df का वर्तमान आउटपुट है:

   A  B
0  3  4
1  0  1
2  3  0
3  0  1
4  4  4

प्रतिस्थापित df का:

   A     B
0  3     4
1  0  YYYY
2  3     0
3  0  YYYY
4  4     4

मैं इसके बजाय क्या चाहता हूं:

   A     B
0  3     4
1  0    1_1
2  3     0
3  0    1_2
4  4     4
2
tandem 2 जुलाई 2020, 13:41

1 उत्तर

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

range और sum के साथ True के मानों की संख्या जैसे समान आकार के साथ आवश्यक जनरेट सूची है, फिर स्ट्रिंग्स में कनवर्ट करें और एक साथ जुड़ें:

m = df['A'] < 2
df.loc[m, 'B'] = df.loc[m, 'B'].astype(str) + '_' + list(map(str, range(1, m.sum() + 1)))

print (df)
   A    B
0  3    4
1  0  1_1
2  3    0
3  0  1_2
4  4    4

या आप नई सूची बनाने के लिए f-strings का उपयोग कर सकते हैं:

m = df['A'] < 2
df.loc[m, 'B'] = [f'{b}_{a}' for a, b in zip(range(1, m.sum() + 1), df.loc[m, 'B'])]

संपादित करें1:

m = df['A'] < 4
df.loc[m, 'B'] = df.loc[m, 'B'].astype(str) + '_' + df[m].groupby('B').cumcount().add(1).astype(str)

print (df)
   A    B
0  3  4_1
1  0  1_1
2  3  0_1
3  0  1_2
4  4    4
2
jezrael 2 जुलाई 2020, 14:02