【问题标题】:Split data into 3 column dataframe将数据拆分为 3 列数据框
【发布时间】:2020-07-14 18:32:46
【问题描述】:

我在将数据文件解析为数据框时遇到问题。当我使用 pandas 读取数据时,我得到一个包含所有信息的一列数据框。

Server    
7.14.182.917 - - [20/Dec/2018:08:30:21 -0500] "GET /tools/performance/log/lib/ui-bootstrap-tpls-0.23.5.min.js HTTP/1.1" 235 89583
7.18.134.196 - - [20/Dec/2018:07:40:13 -0500] "HEAD / HTTP/1.0" 502 -
...

我想解析三列中的数据。我尝试使用df[['Server', 'Date', 'Address']] = pd.DataFrame([ x.split() for x in df['Server'].tolist() ]),但出现错误ValueError: Columns must be same length as key 有没有办法将数据解析为如下 3 列

Server        Date                          Address                               
7.14.182.917  20/Dec/2018:08:30:21 -0500.   "GET /tools/performance/log/lib/ui-bootstrap-tpls-0.23.5.min.js HTTP/1.1" 235 89583

【问题讨论】:

    标签: python pandas dataframe jupyter-notebook


    【解决方案1】:

    根据输入文件类型和格式,这里可以采用多种方法。如果文件是有效的字符串路径,请尝试以下方法(more here)

    import pandas as pd
    # approach 1
    df = pd.read_fwf('inputfile.txt')
    
    # approach 2
    df = pd.read_csv("inputfile.txt", sep = "\t") # check the delimiter
    
    # then select the columns you want
    df_subset = df[['Server', 'Date', 'Address']]
    

    完整解决方案:

    import pandas as pd
    
    # read in text file
    df = pd.read_csv("test_input.txt", sep=" ", error_bad_lines=False)
    
    # convert df to string
    df = df.astype(str)
    
    # get num rows
    num_rows = df.shape[0]
    
    # get IP from index, then reset index
    df['IP'] = df.index
    
    # reset index to proper index
    new_index = pd.Series(list(range(num_rows)))
    df = df.set_index([new_index])
    
    # rename columns and drop old cols
    df = df.rename(columns={'Server': 'Date', 'IP': "Server"})
    
    # create Date col, drop old col
    df['Date'] = df.Date.str.cat(df['Unnamed: 1'])
    df = df.drop(["Unnamed: 1"], axis=1)
    
    # Create address col, drop old col
    df['Address'] = df['Unnamed: 2'] + df['Unnamed: 3'] + df['Unnamed: 4']
    df = df.drop(["Unnamed: 2","Unnamed: 3","Unnamed: 4"], axis=1)
    
    # Strip brackets, other chars
    df['Date'] = df['Date'].str.strip("[]")
    df['Server'] = df["Server"].astype(str)
    df['Server'] = df['Server'].str.strip("()-'', '-',")
    
    

    返回:

    【讨论】:

    • 它不起作用,因为 ['Server', 'Date', 'Address'] 不是数据中存在的名称。我想将一列分成 3 列并为每一列制作标题
    • 首先你需要读入数据。 read_fwfread_csv 都会将数据读入数据框并自动创建列。然后您可以使用df.rename(columns={"A": "a", "B": "c"}) 重命名它们。它确实有效。
    • 读取数据时没有标题,您必须添加标题,当读取数据时,它将所有信息放在一个列数据框中。它不分裂它。因此,如果我按照您的建议进行操作,它会给我一个错误,因为它会将其读取为一列
    • 这是我第一次尝试时所做的,但正如我所说,我只得到一列而不是 3。其他列没有索引
    • 它是什么文件,列之间的分隔符是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多