Python 熊猫按行读取数据
通常情况下,数据是以列作为变量显示的,但如果例如我在.txt文件中有Python 熊猫按行读取数据,python,pandas,Python,Pandas,通常情况下,数据是以列作为变量显示的,但如果例如我在.txt文件中有 Data1,1,2,3,4,5 Data2,3,1,4 我是否可以使用pandas来构建数据帧,使其成为我将从中获得的数据 d = {"Data1":[1,2,3,4,5], "Data2": [3,1,4,1,2]} df = pd.DataFrame(data=d) 编辑: 最初我希望数据集的大小不同,但pandas不允许它抛出一个ValueError读入文件,转置数据帧,咀嚼一点。。。等等 伪造文件的设置: >
Data1,1,2,3,4,5
Data2,3,1,4
我是否可以使用pandas来构建数据帧,使其成为我将从中获得的数据
d = {"Data1":[1,2,3,4,5], "Data2": [3,1,4,1,2]}
df = pd.DataFrame(data=d)
编辑:
最初我希望数据集的大小不同,但pandas不允许它抛出一个
ValueError
读入文件,转置数据帧,咀嚼一点。。。等等
伪造文件的设置:
>>> from io import StringIO
>>> file = StringIO('''Data1,1,2,3,4,5
...:Data2,3,1,4''')
创建数据帧:
>>> df = pd.read_csv(file, header=None).T
>>> df = df.rename(columns=df.loc[0]).drop(0, axis=0)
>>>
>>> df
>>>
Data1 Data2
1 1 3
2 2 1
3 3 4
4 4 NaN
5 5 NaN
然而,彼得·莱姆比格勒(Peter Leimbigler)的回答更优雅一点
正如Alolz所指出的,只有当文件中没有比第一行字段更多的行时,这些解决方案才有效
以下是我对更普遍适用的解决方案的尝试:
>>> file = StringIO('''Data1,3,1,4
...:Data2,1,2,3,4,5
...:Data3,7,8''')
>>> df = pd.concat([pd.Series(line.split(',')) for line in file], axis=1)
>>> df.rename(columns=df.loc[0]).drop(0, axis=0).astype(float)
>>>
Data1 Data2 Data3
1 3.0 1.0 7.0
2 1.0 2.0 8.0
3 4.0 3.0 NaN
4 NaN 4.0 NaN
5 NaN 5.0 NaN
您可以对行中的行执行
data\u dict={line.split(',')[0]:{line.split(',')[1:]for line in line}
,其中line
是通过读取数据创建的。然后应用您想要获得的任何规则[3,1,4,1,2]
,而不是[3,1,4]
(您不需要说什么规则)。然后执行pd.DataFrame(data\u dict)
如果您的第一行不是整行所能读取的最长的,请将其拆分为两行
df = pd.read_csv('test.csv', sep='\n', header=None)
df[0].str.split(',', expand=True).set_index(0).rename_axis(None,0).T
Data1 Data2 Data3
1 1 3 1
2 2 1 2
3 3 4 3
4 4 None 4
5 5 None 5
6 None None 6
7 None None 7
8 None None 8
9 None None 9
示例数据:test.csv
:
d={“Data1”:[[1,2,3,4,5]],“Data2”:[[3,1,4]}
啊,更好!编辑:@Alex我想答案应该在这里打勾!@timgeb,我知道我们在同一时间得出了非常相似的答案:)但这只起作用,因为第一行恰好有最多的数据。交换行失败,因为它无法正确标记。@Alolz true,我试着找到一个更通用的解决方案诚实的问题——这真的是导入CSV数据(使用熊猫)的最佳方式吗第一行哪一行不是最长的?@Evan我不知道。解析器希望不会看到任何一行的字段数超过第一行的非标题行,因此我认为唯一安全的方法是使用pandas将所有内容读入一个字段中。我迷失了另一种方法,无法实现这一点。使用.csv rea可能有更聪明的方法但这两行在概念上很简单。
df = pd.read_csv('test.csv', sep='\n', header=None)
df[0].str.split(',', expand=True).set_index(0).rename_axis(None,0).T
Data1 Data2 Data3
1 1 3 1
2 2 1 2
3 3 4 3
4 4 None 4
5 5 None 5
6 None None 6
7 None None 7
8 None None 8
9 None None 9
Data1,1,2,3,4,5
Data2,3,1,4
Data3,1,2,3,4,5,6,7,8,9