我有一个 pandas 数据框列(数据类型),我想将其分成三列
target_table_df = LoadS_A [['Attribute Name',
'Data Type',
'Primary Key Indicator']]
示例输入(target_table_df)
Attribute Name Data Type Primary Key Indicator
0 ACC_LIM DECIMAL(18,4) False
1 ACC_NO NUMBER(11,0) False
2 ACC_OPEN_DT DATE False
3 ACCB DECIMAL(18,4) False
4 ACDB DECIMAL(18,4) False
5 AGRMNT_ID NUMBER(11,0) True
6 BRNCH_NUM NUMBER(11,0) False
7 CLRD_BAL DECIMAL(18,4) False
8 CR_INT_ACRD_GRSS DECIMAL(18,4) False
9 CR_INT_ACRD_NET DECIMAL(18,4) False
我的目标是:
- 将“数据类型”重新分配给括号前面的文本
[..如果“数据类型”中存在括号]:
- 创建新列“Precision”并分配给第一个逗号分隔的列 值
- 创建新列“Scale”并分配给第二个逗号分隔值
因此,预期输出将变为:
Data Type Precision Scale
0 decimal 18 4
1 number 11 0
2 date
3 decimal 18 4
4 decimal 18 4
5 number 4 0
我愤怒地尝试实现这一目标,但我对数据帧不熟悉......无法确定我是否要迭代所有行,或者是否有办法应用于数据帧中的所有值?
非常感谢任何帮助
最佳答案
使用target_table_df['数据类型'].str.extract(pattern)
您需要将 pattern
指定为捕获您要查找的每个组件的正则表达式。
pattern = r'([^\(]+)(\(([^,]*),(.*)\))?'
([^\(]+)
表示抓取尽可能多的非左括号字符,直到第一个左括号。
\(([^,]*,
表示抓取左括号后的第一组非逗号字符并停在逗号处。
,(.*)\)
表示抓取逗号和右括号之间的其余字符。
(\(([^,]*),(.*)\))?
表示整个括号的事情可能不会发生,如果可以的话捕获它。
解决方案
一切看起来像这样:
pattern = r'([^\(]+)(\(([^,]*),(.*)\))?'
df = s.str.extract(pattern, expand=True).iloc[:, [0, 2, 3]]
# Formatting to get it how you wanted
df.columns = ['Data Type', 'Precision', 'Scale']
df.index.name = None
print df
我在末尾放置了 .iloc[:, [0, 2, 3]]
,因为我使用的模式捕获了 1
列中的整个括号,并且我想跳过它。将其关闭并查看。
Data Type Precision Scale
0 decimal 18 4
1 number 11 0
2 date NaN NaN
3 decimal 18 4
4 decimal 18 4
5 number 11 0
关于Python解析数据框元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37484646/