2016-11-01 39 views
2

I持ってcsvファイルに次のデータ:*と*位置データフレーム内の特定の位置に新しい列

from StringIO import StringIO 
import pandas as pd 

the_data = """ 
ABC,2016-6-9 0:00,95,"{'//PurpleCar': [115L], '//YellowCar': [403L]}","{'GBP/NOK PAWS': [151L], 'CAD/EUR': [41L], 'EDM8-EDM9': [1833L]}" 
ABC,2016-6-10 0:00,100,"{'//PurpleCar': [219L], '//YellowCar': [381L]}","{'FBTPM5 2015-06-08': [472L], 'HKD/MXN': [0L], 'AUD/SEK DEWS': [19482L]}" 
ABC,2016-6-11 0:00,27,"{'//PurpleCar': [572L], '//YellowCar': [184L]}","{'V 2.000 03/31/25': [759L], 'AUD/JPY': [742L], 'AUD/SEK PAWS': [1784L]}" 
ABC,2016-6-12 0:00,41,"{'//PurpleCar': [80L], '//YellowCar': [2011L]}","{'CAR/FIN SWAP': [151L], 'HKD/MXN': [41L], 'RU4': [5829L]}" 
ABC,2016-6-13 0:00,19,"{'//PurpleCar': [32L], '//YellowCar': [15L]}","{'TRY/CHY OIS': [673L], 'NZD/MXN': [582L], 'AUD/SEK PAPS': [4846242L]}" 
DEF,2016-6-9 0:00,8,"{'//PurpleCar': [19L], '//BlackCar': [17L]}","{'ULM5-ULU5 2015-06-19': [18L], 'HKD/MXN': [64L], 'USD/JPY OPTS': [14714L]}" 
DEF,2016-6-10 0:00,2,"{'//PurpleCar': [32L], '//BlackCar': [15L]}","{'U 4.500 2/15/14': [151L], 'FVU6-FVZ6 2016-09-30': [194], 'AUD/SEK': [0L]}" 
DEF,2016-6-11 0:00,20,"{'//PurpleCar': [32L], '//BlackCar': [15L]}","{'EUR/JPY': [158L], 'ARS/MXN': [562L], 'GBP/JPY PAWS': [1759L]}" 
DEF,2016-6-12 0:00,241,"{'//PurpleCar': [28L], '//BlackCar': [96L]}","{'GBP/NOK OIS': [319], 'HKD/SAG': [103L], 'USD/INR': [3L]}" 
DEF,2016-6-13 0:00,400,"{'//PurpleCar': [32L], '//BlackCar': [15L]}","{'TNM6 2016-06-21': [193], 'EDH9': [1713L], 'GZ5': [0]}" 
""" 

として、我々は、そこに二重引用符内の2つの辞書があり、カンマで区切られたこのデータセットの最初の行から見ることができます:

"{'//PurpleCar': [115L], '//YellowCar': [403L]}" 

"{'GBP/NOK PAWS': [151L], 'CAD/EUR': [41L], 'EDM8-EDM9': [1833L]}" 

次のように私はその後の辞書自体は可変長であるという事実に対処するために、データフレームを操作し、キー値は動的です:

fixed_columns = pd.read_csv(StringIO(the_data), 
          names=["Company", "Date", "Value", "Cars_str", 
             "Currency_str"]) 


cars = fixed_columns["Cars_str"].apply(ast.literal_eval) 
del fixed_columns["Cars_str"] 

currencies = fixed_columns["Currency_str"].apply(ast.literal_eval) 
del fixed_columns["Currency_str"] 

def get_single_item(list_that_always_has_single_item): 
    v, = list_that_always_has_single_item 
    return v 

def extract_car_name(car_str): 
    assert car_str.startswith("//"), car_str 
    return car_str[2:] 

def extract_instrument_name(currency_str): 
    assert currency_str.startswith(""), currency_str 
    return currency_str[2:] 


dynamic_column_01 = cars.apply(
    lambda x: pd.Series({ 
      extract_car_name(k): get_single_item(v) 
      for k, v in x.items() 
    })) 

dynamic_column_02 = currencies.apply(
    lambda x: pd.Series({ 
      extract_instrument_name(k): get_single_item(v) 
      for k, v in x.items() 
    })) 


result = pd.concat([fixed_columns, dynamic_column_01, dynamic_column_02], axis=1) 
result 

私の質問:私はなりたいですValue列を取ることができ、それに一定の係数を掛けて、新しい列をValue列の直後(および最初の辞書の直前)に配置します。これを行う方法はありますか?

ありがとうございます!新しい列はあなたが解析されてきた直後fixed_columnsからMultipliedValueを計算することによって、最後に配置し、Cars_strCurrency_str列を削除されます

答えて

2

活用:

... 

cars = fixed_columns["Cars_str"].apply(ast.literal_eval) 
del fixed_columns["Cars_str"] 

currencies = fixed_columns["Currency_str"].apply(ast.literal_eval) 
del fixed_columns["Currency_str"] 

coeff = 1.3 
fixed_columns['MultipliedValue'] = coeff * fixed_columns["Value"] 

... 

result = pd.concat([fixed_columns, dynamic_column_01, dynamic_column_02], axis=1) 
result.columns 

出力:これは完璧に動作

Index(['Company', 'Date', 'Value', 'MultipliedValue', 'BlackCar', 'PurpleCar', 
     'YellowCar', '2.000 03/31/25', '4', '4.500 2/15/14', '5', 'D/EUR', 
     'D/INR', 'D/JPY', 'D/JPY OPTS', 'D/MXN', 'D/SAG', 'D/SEK', 'D/SEK DEWS', 
     'D/SEK PAPS', 'D/SEK PAWS', 'H9', 'M5-ULU5 2015-06-19', 'M6 2016-06-21', 
     'M8-EDM9', 'P/JPY PAWS', 'P/NOK OIS', 'P/NOK PAWS', 'R/FIN SWAP', 
     'R/JPY', 'S/MXN', 'TPM5 2015-06-08', 'U6-FVZ6 2016-09-30', 'Y/CHY OIS'], 
     dtype='object') 
+0

、ありがとうございました! – equanimity

関連する問題