【问题标题】:Add additional column in merged csv file在合并的 csv 文件中添加附加列
【发布时间】:2020-04-13 00:58:31
【问题描述】:

我的代码合并 csv 文件并使用 pandas 删除重复项。 是否可以在单个合并文件中添加带有值的附加标头?

附加标头应称为Host Alias,并应对应于Host Name

例如Host Namedpc01n1 对应的Host Alias 应该是dev_dom1 Host Namedpc02n1 对应的Host Alias 应该是dev_dom2 等等

这是我的代码

from glob import glob
import pandas as pd

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

input_path = r'C:\Users\urale\Desktop\logs'
output_path = r'C:\Users\urale\Desktop\logs' + '\\'
output_name = 'output.csv'

stock_files = sorted(glob(input_path + '\pc_dblatmonstat_*_*.log'))
print(bcolors.OKBLUE + 'Getting .log files from', input_path)

final_headers = [
        'Start Time', 
        'epoch', 
        'Host Name', 
        'Db Alias', 
        'Database', 
        'Db Host', 
        'Db Host IP',
        'IP Port',
        'Latency (us)'
]

#read in files via list comprehension
content = [pd.read_csv(f,usecols = final_headers, sep='[;]',engine='python') 
           for f in stock_files]
print(bcolors.OKBLUE + 'Reading files')


#combine files into one dataframe
combo = pd.concat(content,ignore_index = True)
print(bcolors.OKBLUE + 'Combining files')

#drop duplicates
combo = combo.drop_duplicates()
#combo = combo.drop_duplicates(final_headers, keep=False)
print(bcolors.OKBLUE + 'Dropping duplicates')

#write to csv:
combo.to_csv(output_path + output_name, index = False)
print(bcolors.OKGREEN + 'Merged file output to', output_path, 'as', output_name)

【问题讨论】:

  • 是否可以在单个合并文件中添加带有值的附加标头? 很可能,是的。请参阅How to Askhelp center

标签: python pandas csv


【解决方案1】:
def func(row):
    if row['Host Name'] == "dpc01n1":
        return 'dev_dom1'
    #do your Host Alias generate logic here,and return

combo["Host Alias"]=combo.apply(func, axis=1)

DataFrame.apply 接受一个函数来生成一个新的 Series 或 DataFrame

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票。
  • @xiaoming 谢谢,可惜没用。我没有得到Host Alias 作为新标题,也没有得到dev_dom1 ..
  • @Trunks 你能发布错误消息或打印(组合)吗,这很奇怪,因为我已经测试过并且确定 combo.apply 会起作用
  • @xiaoming 我的错,重启我的电脑后它工作了...... dpc01n1 现在出现在主机别名下。我也可以用 elif 添加 tpc01n1。
  • 当然,你可以使用任何你想为“主机别名”列生成值的逻辑
【解决方案2】:

这样的事情应该可以工作:

import pandas as pd

combo = pd.DataFrame({
        'Start Time' : [1,2,3], 
        'epoch' : [1,2,3], 
        'Host Name': ['dpc01n1','dpc02n1','dpc00103n1'], 
        'Db Alias' : [1,2,3], 
        'Database' : [1,2,3], 
        'Db Host' : [1,2,3], 
        'Db Host IP' : [1,2,3],
        'IP Port' : [1,2,3],
        'Latency (us)' : [1,2,3],
})

h_num = combo['Host Name'].str.lstrip('dpc0').str[:-2]

combo['Host Alias'] = 'dev_dom' + h_num

print(combo)

它假定所有'Host Name's 不以'dpc' 以外的任何其他字符开头,并且不需要像'n1' 这样的两个尾随字符。 Example in python tutor

在 cmets 中提出的后续问题:

它假定我合并的 csv 文件已经有主机别名,但它不会导致错误:发生异常:ValueError Usecols 与列不匹配,列预期但未找到:['Host Alias'] 文件“D :\OneDrive\python\merger.py", line 42, in content = [pd.read_csv(f,usecols = combo_headers, sep='[;]',engine='python') 除了dpc,我还有tpc .我该如何添加呢? – 树干

str.lstrip 将删除参数中提供的所有字符,无论顺序如何。只需添加't'

h_num = combo['Host Name'].str.lstrip('tdpc0').str[:-2]

python tutor example with t added

More reading on str.strip

至于:

假设我合并的 csv 文件已经有主机别名

我不确定你的意思。当你这样做

combo['Host Alias'] = 'dev_dom' + h_num

'Host Alias' 列将在 pandas.DataFrame 中创建,如果它不存在的话。如果确实存在,则该列将被操作返回的新数据替换。然后,您可以使用 pandas.DataFrame.to_csv 将此 DataFrame 保存到 .csv 文件中。

【讨论】:

  • 它假定我合并的 csv 文件已经有 Host Alias 但它不会导致错误:发生异常:ValueError Usecols 与列不匹配,列预期但未找到:['Host Alias'] 文件“D:\OneDrive\python\merger.py”,第 42 行,在 内容 = [pd.read_csv(f,usecols = combo_headers, sep='[;]',engine='python' ) 除了dpc,我还有tpc。我怎么也可以添加它?
  • 只需将't' 添加到.lstrip 参数。 'lstip` 将删除参数中的所有字符,无论顺序如何:h_num = combo['Host Name'].str.lstrip('tdpc0').str[:-2]
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 2019-12-27
  • 2019-11-06
  • 2018-08-31
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多