Python 3将单列拆分为多列而没有逗号

时间:2018-08-23 17:34:44

标签: python python-3.x pandas

使用Python 3.6,我得到了文本阅读器的结果,该文本阅读器使我可以重复以下行:

df

         Col 1
    0    Text A1
    1    Text B1
    2    Text C1
    3    Text D1
    4    Text E1
    5    Text A2
    6    Text B2
    7    Text C2
    8    Text D2
    9    Text E2
   10    Text A3
   11    Text B3
   12    Text C3
   13    Text D3
   14    Text E3

- *添加了编辑:上面的某些文本为空白。 没有逗号可以执行str.split(),并且我不确定重塑是正确的方法。该信息每5个条目重复一次,我正尝试将它们分成几列,以便看起来像这样:

     Col1     Col2     Col3     Col4     Col5
0    Text A1  Text B1  Text C1  Text D1  Text E1
1    Text A2  Text B2  Text C2  Text D2  Text E2
2    Text A3  Text B3  Text C3  Text D3  Text E3

不依靠文本中的标点符号来整形或拆分为5列的pythonic方法是什么?

5 个答案:

答案 0 :(得分:5)

TBH,如果您知道,它们每重复5次,我就会重塑:

In [36]: pd.DataFrame(df.values.reshape(-1, 5), columns=[f"Col {i}" for i in range(1,6)])
Out[36]: 
     Col 1    Col 2    Col 3    Col 4    Col 5
0  Text A1  Text B1  Text C1  Text D1  Text E1
1  Text A2  Text B2  Text C2  Text D2  Text E2
2  Text A3  Text B3  Text C3  Text D3  Text E3

尽管我个人对丢失值保持警惕,所以我可能会根据字符串的某些功能进行分组,例如

pd.concat([v.reset_index(drop=True) 
           for _, v in df.groupby(df["Col 1"].str.rstrip(string.digits))], axis=1)

之类的。

答案 1 :(得分:4)

IIUC,可以groupby arange并仅使用pd.DataFrame默认构造函数

n = df.shape[0] // 5
pd.DataFrame(df.groupby(np.repeat(np.arange(n), 5)).col.apply(lambda s: s.tolist()).tolist())


    0       1       2       3       4
0   Text A1 Text B1 Text C1 Text D1 Text E1
1   Text A2 Text B2 Text C2 Text D2 Text E2
2   Text A3 Text B3 Text C3 Text D3 Text E3

答案 2 :(得分:4)

按索引mod 5和concat水平分组。最后一步就是用rename固定列名。

df = pd.concat([g.reset_index(drop=True) 
         for _, g in df.groupby(df.index % 5)], axis=1)
df.columns = [f'Col {i}' for i in range(1, 6)]

     Col 1    Col 2    Col 3    Col 4    Col 5
0  Text A1  Text B1  Text C1  Text D1  Text E1
1  Text A2  Text B2  Text C2  Text D2  Text E2
2  Text A3  Text B3  Text C3  Text D3  Text E3

答案 3 :(得分:4)

通过使用pd.crosstab

pd.crosstab(index=np.arange(len(df))//5,columns = np.arange(len(df))%5,values=df['Col 1'],aggfunc='sum')
Out[382]: 
col_0         0         1         2         3         4
row_0                                                  
0       Text A1   Text B1   Text C1   Text D1   Text E1
1       Text A2   Text B2   Text C2   Text D2   Text E2
2       Text A3   Text B3   Text C3   Text D3   Text E3

答案 4 :(得分:1)

如果某些重复实际上不是5个怎么办?即一些重复4而其他5重复?如果您不知道重复的次数怎么办?:您可以固定数据,然后将其整形为宽幅

a = df.assign(ID = df['Col 1'].replace('\\D','',regex=True),
              col = df['Col 1'].replace('.*(.)\\d','col \\1',regex=True))

pd.crosstab(a.ID,a.col,a['Col 1'],aggfunc=lambda x:x) #Using an identity function

col    col A    col B    col C    col D    col E
ID                                              
1    Text A1  Text B1  Text C1  Text D1  Text E1
2    Text A2  Text B2  Text C2  Text D2  Text E2
3    Text A3  Text B3  Text C3  Text D3  Text E3