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
((.+?): )(.+)')