मैं अजगर पर पांडा में एक परियोजना पर काम कर रहा हूँ। मुझे इनपुट के रूप में एक .csv फ़ाइल इस तरह प्राप्त होती है:

Name,Time,Data
A,5.6,"[1,2,3]"
A,1.2,"[1.4,3,8.9]"
...
B,3.4,"[0.2,3,5.1]"
ecc..

(मेरे पास हर नाम के लिए हजारों डेटा हैं और 10 नामों की तरह)। तो पांडा में तालिका है:

Name   Time       Data
A       5.6      [1,2,3]
A       1.2      [1.4,3,8.9]
...      
B       3.4      [0.2,3,5.1]
...

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

मुझे पता है कि पूरे कॉलम पर एक ऑपरेशन करना इस प्रकार है:

df['Data'] = df['Data'].apply(lambda x: x*2)

मैं इस तरह से "ए" सूची के प्रत्येक नंबर को गुणा कर सकता हूं:

[x*2 for x in a]

और मैं स्ट्रिंग को एस्ट के साथ एक सूची में परिवर्तित कर सकता हूं:

a = ast.literal_eval(a) # (and with a = str(a).strip('[]') i can return to the string)

लेकिन मैं इन 3 चीजों को मिला नहीं सकता।

क्या आपके पास कोई उपाय है? (जरूरी नहीं कि उन्हीं तरीकों से मैंने यहां कोशिश की हो)। आपका अग्रिम में ही बहुत धन्यवाद!

1
Kraton 7 सितंबर 2019, 21:32

2 जवाब

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

मेरा सुझाव है कि पहले ast.literal_eval का उपयोग करके सब कुछ एक सूची में परिवर्तित करें:

import pandas as pd

df = pd.DataFrame({
    'Name': ['A', 'A'],
    'Time': [5.6, 1.2],
    'Data': ["[1, 2, 3]", "[1.4, 3, 8.9]"]
})

import ast

df['Data'] = df['Data'].apply(ast.literal_eval)

और उसके बाद आप नियमित सूची संचालन का उपयोग कर सकते हैं:

df['Data'] = df['Data'].apply(lambda x: [i*2 for i in x])
print(df['Data'])

आउटपुट:

0         [2, 4, 6]
1    [2.8, 6, 17.8]
Name: Data, dtype: object

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

श्रृंखला को वापस एक स्ट्रिंग में बदलने के लिए apply फिर से उपयोग करें:

df['Data'] = df['Data'].apply(str)

हालांकि मैं वास्तव में इसका सुझाव नहीं दूंगा - स्ट्रिंग प्रस्तुति की बजाय सूची को सूची के रूप में संग्रहीत करना अधिक सुविधाजनक है। यदि आप सूची संचालन का उपयोग जारी रखना चाहते हैं, तो इसे सूची के रूप में रखना बेहतर है।

4
Primusa 7 सितंबर 2019, 22:33

आपको ast का लाभ उठाने की आवश्यकता नहीं है - आप [] " से अपनी सूची-पाठ प्रस्तुति को "साफ" कर सकते हैं और स्ट्रिंग की सूची प्राप्त करने के लिए split(",") का उपयोग कर सकते हैं।

फ्लोट में कनवर्ट करने के लिए मानचित्र का उपयोग करें और अपने स्थिरांक से गुणा करें:

डेमो डेटा फ़ाइल बनाएँ:

data = """Name,Time,Data
A,5.6,"[1,2,3]"
A,1.2,"[1.4,3,8.9]"
B,3.4,"[0.2,3,5.1]" """

with open("d.txt","w") as f:
    f.write(data)

प्रक्रिया डेमो डेटा फ़ाइल:

import pandas as pd

df = pd.read_csv("d.txt")
print(df)

constant = 3
df['Data_2'] = df['Data'].apply(
    lambda x: [x*constant for x in map(float, x.strip("[]\" ").split(","))])


print(df)

आउटपुट:

  Name  Time          Data
0    A   5.6       [1,2,3]
1    A   1.2   [1.4,3,8.9]
2    B   3.4  [0.2,3,5.1] 

रूपांतरण के बाद आउटपुट:

  Name  Time          Data                                         Data_2
0    A   5.6       [1,2,3]                                [3.0, 6.0, 9.0]
1    A   1.2   [1.4,3,8.9]   [4.199999999999999, 9.0, 26.700000000000003]
2    B   3.4  [0.2,3,5.1]   [0.6000000000000001, 9.0, 15.299999999999999]
2
Patrick Artner 7 सितंबर 2019, 21:43