【问题标题】:How to make the values of a pandas dataframe column as column如何将熊猫数据框列的值设为列
【发布时间】:2017-09-28 23:30:05
【问题描述】:

我想重塑我的数据框:

来自 Input_DF

col1                                                 col2  col3
Course_66    0\nCourse_67    1\nCourse_68    0       a     c  
Course_66    1\nCourse_67    0\nCourse_68    0       a     d    

到 Output_DF

   Course_66       Course_67       Course_68    col2  col3
           0              0                1     a     c  
           0              1                0     a     d    

请注意 col1 包含一个长字符串。

请,任何帮助将不胜感激。 提前谢谢了。 此致, 卡罗

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    用途:

    #first split by whitespaces to df
    df1 = df['col1'].str.split(expand=True)
    #for each column split by \n and select first value 
    df2 = df1.apply(lambda x: x.str.split(r'\\n').str[0])
    #for columns select only first row and select second splitted value
    df2.columns = df1.iloc[0].str.split(r'\\n').str[1]
    print (df2)
    0 Course_66 Course_67 Course_68
    0         0         0         1
    1         0         1         0
    
    #join to original, remove unnecessary column
    df = df2.join(df.drop('col1', axis=1))
    print (df)
      Course_66 Course_67 Course_68 col2 col3
    0         0         0         1    a    c
    1         0         1         0    a    d
    

    list理解的另一种解决方案:

    L = [[y.split('\\n')[0] for y in x.split()] for x in df['col1']]
    cols = [x.split('\\n')[1] for x in df.loc[0, 'col1'].split()]
    df1 = pd.DataFrame(L, index=df.index, columns=cols)
    print (df1)
      Course_66 Course_67 Course_68
    0         0         0         1
    1         0         1         0
    

    编辑:

    #split values by whitespaces - it split by \n too
    df1 = df['course_vector'].str.split(expand=True)
    #select each pair columns
    df2 = df1.iloc[:, 1::2]
    #for columns select each unpair value in first row
    df2.columns = df1.iloc[0, 0::2]
    #join to original
    df = df2.join(df.drop('course_vector', axis=1))
    

    【讨论】:

    • 我希望我能投票,但我今天的投票上限超过了
    • 非常感谢耶兹瑞尔。但是,当我将您的第一个解决方案应用于我的数据时,我得到了以下信息:0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 Course_31 0 Course_3A 0 Course_47 1 Course_48 0 Course_5B 0 Course_5C 0 Course_5D 0 Course_5E 0 Course_5F 0 Course_60 0。第二个解决方案我不能使用它,因为我的输入数据框包含索引作为列。
    • 嗯,您的数据非常具体,可能有点不同。如果不是机密数据,是否可以创建前 5 行的 picle 文件并将其发送到我的电子邮件? df.head().to_pickle('file.pkl')
    • 刚刚做到了。请告诉我你是否收到了。非常感谢。
    【解决方案2】:

    由于您的数据是按值、键对排序的,因此您可以使用正则表达式在换行符和多个空格上拆分以获取列表,然后从值的第一个位置和标签的第二个位置开始获取所有其他值并返回Series 对象。通过申请,你会从这多个系列中得到一个DataFrame,然后你可以将它与原来的DataFrame结合起来。

    import pandas as pd                                                                                                                                                                                                                       
    
    df = pd.DataFrame({'col1': ['0\nCourse_66    0\nCourse_67    1\nCourse_68',                                                                                                                                                               
                                '0\nCourse_66    1\nCourse_67    0\nCourse_68'],                                                                                                                                                              
                    'col2': ['a', 'a'], 'col3': ['c', 'd']})                                                                                                                                                                                  
    
    def to_multiple_columns(str_list):                                                                                                                                                                                                        
        # take the numeric values for each series and column labels and return as a series                                                                                                                                                    
        # by taking every other value                                                                                                                                                                                                         
        return pd.Series(str_list[::2], str_list[1::2])                                                                                                                                                                                       
    
    # split on newlines and spaces                                                                                                                                                                                                                
    splits = df['col1'].str.split(r'\n|\s+').apply(to_multiple_columns)                                                                                                                                                                       
    
    output = pd.concat([splits, df.drop('col1', axis=1)], axis=1)                                                                                                                                                                             
    print(output)
    

    输出:

      Course_66 Course_67 Course_68 col2 col3
    0         0         0         1    a    c
    1         0         1         0    a    d
    

    【讨论】:

    • 非常感谢 benjwadams。我意识到我的输入数据存在问题,这与我上面在输入数据框中报告的不同。不幸的是,我无法应用您的解决方案。非常感谢您的努力。
    • 我更改了原始数据中报告的输入数据集。但是,您的假设“按价值排序”在我的数据中并不正确。这只是巧合。
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2021-03-06
    • 2022-01-19
    相关资源
    最近更新 更多