使用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方法是什么?
答案 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