Python 熊猫将逗号分隔的键值输出为表格形式
我有下面的输出,这是一种逗号分隔的键值对,列出了我希望所有Python 熊猫将逗号分隔的键值输出为表格形式,python,pandas,Python,Pandas,我有下面的输出,这是一种逗号分隔的键值对,列出了我希望所有键变成列名,而值将变成列值的地方,我想知道这是否可以在熊猫中完成 Hostname: dpc8584.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0 Hostname: dpc8585.test.domain.com, bond0
键
变成列名
,而值
将变成列值的地方,我想知道这是否可以在熊猫中完成
Hostname: dpc8584.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8585.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8586.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8587.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8588.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8589.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
Hostname: dpc8590.test.domain.com, bond0: OK (up), Active Slave: ens3f0, PriSlave: ens3f0 (up), SecSlave: ens3f1 (up), LFCPriInt: 0, LFCSecInt: 0
我的预期输出为:
我的方法 您需要阅读
.csv
或.txt
文件:
df = pd.read_csv('/path/textfile.csv',header=None)
0 1 2 \
0 Hostname: dpc8584.test.domain.com bond0: OK (up) Active Slave: ens3f0
1 Hostname: dpc8585.test.domain.com bond0: OK (up) Active Slave: ens3f0
2 Hostname: dpc8586.test.domain.com bond0: OK (up) Active Slave: ens3f0
3 Hostname: dpc8587.test.domain.com bond0: OK (up) Active Slave: ens3f0
4 Hostname: dpc8588.test.domain.com bond0: OK (up) Active Slave: ens3f0
5 Hostname: dpc8589.test.domain.com bond0: OK (up) Active Slave: ens3f0
6 Hostname: dpc8590.test.domain.com bond0: OK (up) Active Slave: ens3f0
3 4 5 \
0 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
1 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
2 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
3 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
4 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
5 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
6 PriSlave: ens3f0 (up) SecSlave: ens3f1 (up) LFCPriInt: 0
6
0 LFCSecInt: 0
1 LFCSecInt: 0
2 LFCSecInt: 0
3 LFCSecInt: 0
4 LFCSecInt: 0
5 LFCSecInt: 0
6 LFCSecInt: 0
然后我们可以做:
df2 = df.stack().str.split(':',expand=True)
df2 = df2.rename(columns={0:'columns'}) #neccesary here
new_df = df2.pivot_table(index=df2.index.get_level_values(0),
columns='columns',
values=1,
aggfunc='first')
print(new_df)
我的两分钱: 有一个像这样的txt 如果列标题更改,只需使用正则表达式调整行即可
((.+?): )(.+)')
…来匹配其他东西你所说的“输出”是什么意思?这已经是某个对象的某些打印输出,或者这只是您拥有的某个文件的开始,等等?@GWD,很抱歉混淆,它的打印输出确实是从一个tootset获得的。那么您在那里打印了什么(对象)?tootset?这是一个简单的文本输出,在我粘贴时捕获到一个文件中。到底是什么问题?你试过什么,做过什么研究吗?堆栈溢出不是免费的代码编写服务。请参阅:,.thnx@ansev,我们是否可以将
Hostname
列作为第一列而不是第一列。解决方案已为+1。是的,您可以使用:new_df=new_df.reindex(columns=['Hostname']+new_df.columns[:-1].tolist())
您可以按所需顺序输入列表new_df=new_df.reindex(columns=[您的订单标签]
import pandas as pd
import re
df = pd.read_csv('log_to_df.txt', header=None)
df
pattern = re.compile(r'((.+?): )(.+)')
cols = []
for col in df.columns:
temp = pattern.match(df[col][0])
cols.append(temp[2])
df[col] = df[col].str.replace(temp[1], '', regex=True)
df.columns = cols
df
((.+?): )(.+)')