如何从CSV数据中用NumPy数组构建含6列的Pandas DataFrame
解决CSV中numbers列拆分为多列的问题
问题根源
你遇到的ValueError是因为直接将numbers列转成numpy数组后,每个元素仍是完整的空格分隔字符串,数组形状为(1414,1),但你试图指定6列,形状不匹配;调整后仅得到1列,也是因为没有对字符串进行拆分,只是把每个完整字符串作为单列值。
解决方案
核心是先将numbers列的字符串按空格拆分成6个独立字段,再合并到原数据中。以下是两种高效实现方式:
方法1:使用str.split(expand=True)(推荐)
这是Pandas中拆分字符串列最直接高效的方式,expand=True会直接将拆分结果转为多列DataFrame:
import pandas as pd # 读取数据并处理日期排序 data = pd.read_csv('pbhistory.csv') data['date'] = pd.to_datetime(data.date, infer_datetime_format=True) data.sort_values(by='date', ascending=True, inplace=True) # 拆分numbers列为6列,设置列名 split_numbers = data['numbers'].str.split(' ', expand=True) split_numbers.columns = ['1', '2', '3', '4', '5', '6'] # 合并原数据的日期、multiplier列与拆分后的数字列 final_df = pd.concat([data[['date', 'multiplier']], split_numbers], axis=1) # 可选:将拆分后的列转为整数类型 final_df[['1', '2', '3', '4', '5', '6']] = final_df[['1', '2', '3', '4', '5', '6']].astype(int) print(final_df.head())
方法2:使用apply结合pd.Series
如果需要更灵活的拆分逻辑(比如处理不规则空格),可以用apply遍历每行字符串并转为Series:
import pandas as pd data = pd.read_csv('pbhistory.csv') data['date'] = pd.to_datetime(data.date, infer_datetime_format=True) data.sort_values(by='date', ascending=True, inplace=True) # 拆分字符串并转为多列 split_numbers = data['numbers'].apply(lambda x: pd.Series(x.split())) split_numbers.columns = ['1', '2', '3', '4', '5', '6'] final_df = pd.concat([data[['date', 'multiplier']], split_numbers], axis=1) final_df[['1', '2', '3', '4', '5', '6']] = final_df[['1', '2', '3', '4', '5', '6']].astype(int) print(final_df.head())
预期输出
执行代码后会得到包含日期、multiplier和6个数字列的DataFrame:
date multiplier 1 2 3 4 5 6 0 2020-09-26 3 11 21 27 36 62 24 1 2020-09-30 2 14 18 36 49 67 18 2 2020-10-03 2 18 31 36 43 47 20
内容的提问来源于stack exchange,提问作者user2643864
相关产品推荐
相关产品推荐

