我在 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,0,"{'//PurpleCar': [219L], '//YellowCar': [381L]}","{'FBTPM5 2015-06-08': [472L], 'HKD/MXN': [0L], 'AUD/SEK DEWS': [19482L]}"
ABC,2016-6-11 0:00,0,"{'//PurpleCar': [572L], '//YellowCar': [184L]}","{'V 2.000 03/31/25': [759L], 'AUD/JPY': [742L], 'AUD/SEK PAWS': [1784L]}"
ABC,2016-6-12 0:00,0,"{'//PurpleCar': [80L], '//YellowCar': [2011L]}","{'CAR/FIN SWAP': [151L], 'HKD/MXN': [41L], 'RU4': [5829L]}"
ABC,2016-6-13 0:00,0,"{'//PurpleCar': [32L], '//YellowCar': [15L]}","{'TRY/CHY OIS': [673L], 'NZD/MXN': [582L], 'AUD/SEK PAPS': [4846242L]}"
DEF,2016-6-9 0:00,0,"{'//PurpleCar': [19L], '//BlackCar': [17L]}","{'ULM5-ULU5 2015-06-19': [18L], 'HKD/MXN': [64L], 'USD/JPY OPTS': [14714L]}"
DEF,2016-6-10 0:00,0,"{'//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,0,"{'//PurpleCar': [32L], '//BlackCar': [15L]}","{'EUR/JPY': [158L], 'ARS/MXN': [562L], 'GBP/JPY PAWS': [1759L]}"
DEF,2016-6-12 0:00,0,"{'//PurpleCar': [28L], '//BlackCar': [96L]}","{'GBP/NOK OIS': [319], 'HKD/SAG': [103L], 'USD/INR': [3L]}"
DEF,2016-6-13 0:00,0,"{'//PurpleCar': [32L], '//BlackCar': [15L]}","{'TNM6 2016-06-21': [193], 'EDH9': [1713L], 'GZ5': [0]}"
"""
从这个新数据集的第一行可以看出,双引号内有两个字典,并用逗号分隔:
"{'//PurpleCar': [115L], '//YellowCar': [403L]}"
和
"{'GBP/NOK PAWS': [151L], 'CAD/EUR': [41L], 'EDM8-EDM9': [1833L]}"
(How to remove curly braces, apostrophes and square brackets from dictionaries in a Pandas dataframe (Python)中提出的原始问题仅涉及 ONE字典。)
另请注意,在这个新数据集中,第二个字典中的键值基本上可以是。
我使用以下代码读取数据。前三列是固定的,我们将它们保留原样。第四列("Cars_str"
)我使用ast.literal_eval
进行解析,因为它是dict
:
import ast
import pandas as pd
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"]
接下来,我们准备函数来处理dict
:
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:]
然后,我们应用函数并构造pd.Series
:
dynamic_columns = cars.apply(
lambda x: pd.Series({
extract_car_name(k): get_single_item(v)
for k, v in x.items()
}))
最后,我们将列添加到数据框:
result = pd.concat([fixed_columns, dynamic_columns], axis=1)
result
这给了我们以下内容:
Company Date Value Currency_str BlackCar PurpleCar YellowCar
0 ABC 2016-6-9 0:00 95 {'GBP/NOK PAWS': [151L], 'CAD/EUR': [41L], 'ED... NaN 115.0 403.0
1 ABC 2016-6-10 0:00 0 {'FBTPM5 2015-06-08': [472L], 'HKD/MXN': [0L],... NaN 219.0 381.0
2 ABC 2016-6-11 0:00 0 {'V 2.000 03/31/25': [759L], 'AUD/JPY': [742L]... NaN 572.0 184.0
3 ABC 2016-6-12 0:00 0 {'CAR/FIN SWAP': [151L], 'HKD/MXN': [41L], 'RU... NaN 80.0 2011.0
4 ABC 2016-6-13 0:00 0 {'TRY/CHY OIS': [673L], 'NZD/MXN': [582L], 'AU... NaN 32.0 15.0
5 DEF 2016-6-9 0:00 0 {'ULM5-ULU5 2015-06-19': [18L], 'HKD/MXN': [64... 17.0 19.0 NaN
6 DEF 2016-6-10 0:00 0 {'U 4.500 2/15/14': [151L], 'FVU6-FVZ6 2016-09... 15.0 32.0 NaN
7 DEF 2016-6-11 0:00 0 {'EUR/JPY': [158L], 'ARS/MXN': [562L], 'GBP/JP... 15.0 32.0 NaN
8 DEF 2016-6-12 0:00 0 {'GBP/NOK OIS': [319], 'HKD/SAG': [103L], 'USD... 96.0 28.0 NaN
9 DEF 2016-6-13 0:00 0 {'TNM6 2016-06-21': [193], 'EDH9': [1713L], 'G... 15.0 32.0 NaN
我遇到的问题是,我希望能够访问'Currency_str'
列并执行以下操作:
1)提取密钥并将其设置为数据框中的列标题
2)将这些键的关联值保持为行的元素
完全与我们对'Cars_str'
字典(以及我在How to remove curly braces, apostrophes and square brackets from dictionaries in a Pandas dataframe (Python)中接受的解决方案)所做的相同。
基本上,我希望能够将上面的代码应用于两个词典,其中键是列标题,值是行的元素。
任何人都可以帮我修改代码,以便我们可以完成上面的第1点和第2点吗?
谢谢!
更新 - >>解决方案:
我找到了一个有效的解决方案。这是:
import ast
import pandas as pd
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
答案 0 :(得分:0)
以下是答案:
import ast
import pandas as pd
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