首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用两个现有列在Pandas中创建新列*和*将新列定位在数据帧中的某个位置

如何使用两个现有列在Pandas中创建新列*和*将新列定位在数据帧中的某个位置
EN

Stack Overflow用户
提问于 2016-11-01 17:03:44
回答 1查看 71关注 0票数 2

我在csv文件中有以下数据

代码语言:javascript
复制
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]}"
"""

从这个数据集的第一行可以看到,在双引号中有两个字典,用逗号隔开:

代码语言:javascript
复制
"{'//PurpleCar': [115L], '//YellowCar': [403L]}"

代码语言:javascript
复制
"{'GBP/NOK PAWS': [151L], 'CAD/EUR': [41L], 'EDM8-EDM9': [1833L]}"

然后,我按如下方式操作数据框架,以处理字典本身是可变长度和键值是动态的事实:

代码语言:javascript
复制
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列之后(并且就在第一个字典之前)。有办法这样做吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 17:21:22

在解析和删除了MultipliedValueCurrency_str列之后,通过从fixed_columns中计算Cars_strCurrency_str列,就可以利用这些新列的末尾位置:

代码语言:javascript
复制
...

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

输出:

代码语言:javascript
复制
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')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40364921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档