使用python和pandas将CSV文件中的三列合并为一列

Abob

嗨,我正在尝试将几个现有列合并为1个新列,然后删除CSV文件中的三个原始列。我一直在尝试用熊猫做这件事,但是运气并不好。我是python的新手。

我的代码首先在同一目录中合并了几个CSV文件,然后尝试操纵这些列。第一个合并工作,我得到了包含合并数据的output.csv,但是列的合并却没有。

import glob
import pandas as pd

interesting_files = glob.glob("*.csv")

header_saved = False
with open('output.csv','wb') as fout:
    for filename in interesting_files:
        with open(filename) as fin:
            header = next(fin)
            if not header_saved:
                fout.write(header)
                header_saved = True
            for line in fin:
                fout.write(line)

df = pd.read_csv("output.csv")
df['HostAffected']=df['Host'] + "/" + df['Protocol'] + "/" + df['Port']
df.to_csv("newoutput.csv")

有效地解决这个问题:

Host,Protocol,Port
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,445
10.0.0.10,tcp,49707
10.0.0.10,tcp,49672
10.0.0.10,tcp,49670

变成这样的东西:

HostsAffected
10.0.0.10/tcp/445
10.0.0.10/tcp/445
10.0.0.10/tcp/445
10.0.0.10/tcp/445
10.0.0.10/tcp/445
10.0.0.10/tcp/445
10.0.0.11/tcp/445
10.0.0.11/tcp/49707
10.0.0.11/tcp/49672
10.0.0.11/tcp/49670
10.0.0.11/tcp/49668
10.0.0.11/tcp/49667

csv中还有其他列。

我不是编码人员,我只是想解决一个问题,对您的帮助非常感谢。

安东vBR

从我的角度来看,我们有三种选择:

%timeit df['Host'] + "/" + df['Protocol'] + "/" + df['Port'].map(str)
%timeit ['/'.join(i) for i in zip(df['Host'],df['Protocol'],df['Port'].map(str))]
%timeit ['/'.join(i) for i in df[['Host','Protocol','Port']].astype(str).values]

时间

10 loops, best of 3: 39.7 ms per loop  
10 loops, best of 3: 35.9 ms per loop  
10 loops, best of 3: 162 ms per loop

无论多么慢,我认为这都是您最易读的方法:

import pandas as pd

data = '''\
ID,Host,Protocol,Port
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,49707
1,10.0.0.10,tcp,49672
1,10.0.0.10,tcp,49670'''

df = pd.read_csv(pd.compat.StringIO(data)) # Recreates a sample dataframe

cols = ['Host','Protocol','Port']
newcol = ['/'.join(i) for i in df[cols].astype(str).values]
df = df.assign(HostAffected=newcol).drop(cols, 1)
print(df)

返回值:

   ID         HostAffected
0   1    10.0.0.10/tcp/445
1   1    10.0.0.10/tcp/445
2   1    10.0.0.10/tcp/445
3   1    10.0.0.10/tcp/445
4   1    10.0.0.10/tcp/445
5   1    10.0.0.10/tcp/445
6   1    10.0.0.10/tcp/445
7   1  10.0.0.10/tcp/49707
8   1  10.0.0.10/tcp/49672
9   1  10.0.0.10/tcp/49670

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python Pandas将日期和小时合并为一列,并使用lineplot进行绘制

如何根据三列中的顺序将三列合并为一列

将多列合并为一列作为python pandas中的列表

将包含空字符串的列合并为python pandas中的一列

如何使用 Python 和 Pandas 将具有相似和不同列的多个 CSV 文件合并为 1?

使用Pandas读取csv时,如何将一系列列合并为一列?

使用 Pandas 将三个单独的 CSV 文件中的特定元素合并为一个 CSV 文件

将开始和结束列合并为一列

熊猫read_csv大文件将每一列合并为一

将列合并为一列

将网址列合并为R中的一列

将列中的值合并为一列

将excel中的多列合并为pandas中的一列

Python Pandas groupby 和 mean/stdev 所有列合并为一列

Python Pandas:将具有列名称的数据框列合并为一列

使用pandas或excel writer将两列合并为一列保持层次结构

将大量的空白列合并为一列(Postgres和Python)

是否可以将矩阵的行和列合并为R中的一列?

使用python覆盖csv文件中的第一列和最后一列

将两列三列合并为一列将保留

如何将两列合并为一列(使用 Python)?

将Pandas DataFrame行合并为一列中的字符串

SQL 将三列合并为一

将三张表的通用列合并为一列

如何使用pandas根据列ID将多个csv文件合并为1个文件

R将两列合并/合并为一列

如何在python中将三列合并为一列

pandas 将分组的列合并为一列带有 id 的列?

将两列合并为一列 - 日期和时间列并更改其格式