解析包含函数的数据帧列

2024-10-02 08:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是Python/熊猫新手。我尝试使用的csv文件已填充了如下数据:

A                                                      B            C       D
Option1(item1=12345, item12='string', item345=0.123)   2020-03-16   1.234   Option2(item4=123, item56=234, item678=345)

我希望它看起来像这样:

item1   item12     item345   B            C      item4   item56   item678
12345   'string'   0.123     2020-03-16   1.234  123     234      345

换言之,我想用以等号左边的内容为首的新列替换A列和D列,使用等号右边的内容作为相应的值,并去掉Option1()和Option2()部分以及逗号。不包含函数的列应保持原样

有没有一种优雅的方法可以做到这一点

事实上,在这一点上,我会满足于任何旧的方式,优雅与否;我已经找到了处理这种情况的各种方法,比如说,如果有dicts填充列,但是如果有函数存在,没有什么可以帮助我区分它。尝试搜索答案只会给我一系列关于如何将函数应用于数据帧的结果


Tags: csv数据方法函数内容stringoption1item1
2条回答

只要你的函数总是有相同的参数,这应该是可行的

您可以使用以下选项阅读csv(如果分隔符是2个或更多空格,这是我粘贴问题示例时得到的):

df = pd.read_csv('test.csv',sep='[\s]{2,}', index_col=False, engine='python')

如果您的数据帧为df

# break out both sides of the equal sign in function into columns
A_vals = df['A'].str.extractall(r'([\w\d]+)=([^,\)]*)')

# get rid of the multi-index and put the values after '=' into columns
A_converted = A_vals.unstack(level=-1)[1]

# set column names to values before '='
A_converted.columns = list(A_vals.unstack(level=-1)[0].values[0])

# same thing for 'D'
D_vals = df['D'].str.extractall(r'([\w\d]+)=([^,\)]*)')
D_converted = D_vals.unstack(level=-1)[1]
D_converted.columns = list(D_vals.unstack(level=-1)[0].values[0])

# join everything together
df = A_converted.join(df.drop(['A','D'], axis=1)).join(D_converted)

关于regex{}的一些说明有两个捕获组(每个部分在parens中):

组1([\w\d]+)是一个或多个字符(+),它们是单词字符\w或数字\d

组间的=

第2组([^,\)]*)是0个或多个字符(*),它们不是(^)逗号,或括号\)

我相信你正在寻找以下线索:

contracts = ["Option(conId=384688665, symbol='SPX', lastTradeDateOrContractMonth='20200116', strike=3205.0, right='P', multiplier='100', exchange='SMART', currency='USD', localSymbol='SPX   200117P03205000', tradingClass='SPX')",    
"Option(conId=12345678, symbol='DJX', lastTradeDateOrContractMonth='20200113', strike=1205.0, right='P', multiplier='200', exchange='SMART', currency='USD', localSymbol='DJXX   333117Y13205000', tradingClass='DJX')"]

new_conts = []
columns = []

for i in range (len(contracts)):
    mod = contracts[i].replace('Option(','').replace(')','')
    contracts[i] = mod    
    new_cont = contracts[i].split(',')
    new_conts.append(new_cont)

for contract in new_conts:
    column = []
    for i in range (len(contract)):
        mod = contract[i].split('=')
        contract[i] = mod[1]
        column.append(mod[0])
    columns.append(column)

print(len(columns[0]))
df = pd.DataFrame(new_conts,columns=columns[0])
df

输出:

    conId   symbol  lastTradeDateOrContractMonth    strike  right   multiplier  exchange    currency    localSymbol     tradingClass
0   384688665   'SPX'   '20200116'  3205.0  'P'     '100'   'SMART'     'USD'   'SPX 200117P03205000'   'SPX'
1   12345678    'DJX'   '20200113'  1205.0  'P'     '200'   'SMART'     'USD'   'DJXX 333117Y13205000'  'DJX'

显然,您可以删除不需要的列、更改名称等

相关问题 更多 >

    热门问题