मैं एक एक्सेल फ़ाइल से दो डेटाफ्रेम मानों को एक नए डेटाफ्रेम में जोड़ रहा हूं लेकिन संयुक्त मान दशमलव संख्या में बदल गए हैं। यहाँ मेरे कोड हैं:

मेरा डेटाफ्रेम जिसे मैं संयोजित करना चाहता हूं:

cable_block    pair
1              10
1              11
3              123
3              222

मैं उन दोनों को / के सीमांकक के साथ संयोजित करने के लिए एक डेटाफ़्रेम सम्मिलित करता हूँ, इसलिए मेरा कोड यहाँ है:

df['new_col'] = df[['cable_block', 'pair']].apply(lambda x: '/'.join(x.astype(str), axis=1))

मुझे जो परिणाम मिलता है वह है:

cable_block    pair   new_col
1              10     1.0/10.0
1              11     1.0/11.0
3              123    3.0/123.0
3              222    3.0/222.0

खोजने के बाद, मुझे इसके द्वारा अच्छा उत्तर मिला यहां Psidom और Skirrebattie। तो मैंने कोशिश की:

df['new_col'] = df['new_col'].applymap(str)

तथा

df['new_col'] = df['new_col'].astype(str)

लेकिन यह उस तरह से काम नहीं करता जैसा इसे करना चाहिए। कोड को देखते हुए, इसे काम करना चाहिए और मुझे यह अजीब लगता है कि ऐसा नहीं है।

क्या कोई और कामकाज है?

2
Ricky Aguilar 1 अक्टूबर 2018, 19:07

4 जवाब

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

सबसे पहले, पिछली .0 को हटाने के लिए सुनिश्चित करें कि डेटा int है:

 df = df.astype(int)

तब आप कर सकते हैं:

df['cable_block'].astype(str) + '/' + df['pair'].astype(str)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object

सही स्वरूपण सुनिश्चित करने के लिए एक अन्य विकल्प हो सकता है:

 df.apply(lambda x: "%d/%d" %(x['cable_block'], x['pair']), axis=1)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object
3
Mabel Villalba 1 अक्टूबर 2018, 19:30

आप एक सूची समझ और एफ-स्ट्रिंग का उपयोग कर सकते हैं:

df['new_col'] = [f'{cable_block}/{pair}' for cable_block, pair in df.values]

print(df)

   cable_block  pair new_col
0            1    10    1/10
1            1    11    1/11
2            3   123   3/123
3            3   222   3/222

दृष्टिकोण यथोचित रूप से विकल्पों की तुलना करता है:

df = pd.concat([df]*10000, ignore_index=True)

%timeit df['cable_block'].astype(str) + '/' + df['pair'].astype(str)  # 62.8 ms
%timeit [f'{cable_block}/{pair}' for cable_block, pair in df.values]  # 85.1 ms
%timeit list(map('/'.join, map(list, df.values.astype(str))))         # 157 ms
%timeit df.astype(str).apply('/'.join,1)                              # 1.11 s
0
jpp 1 अक्टूबर 2018, 19:46
df['cable_block'].astype(int).astype(str) + '/' + df['pair'].astype(int).astype(str)

आपके डेटाफ्रेम में डेटा शायद तैरता है, न कि इन्ट्स।

0
CJR 1 अक्टूबर 2018, 19:27

astype का उपयोग क्यों नहीं कर रहे हैं

df.astype(str).apply('/'.join,1)
Out[604]: 
0     1/10
1     1/11
2    3/123
3    3/222
dtype: object
2
BENY 1 अक्टूबर 2018, 19:10