Python 熊猫按行读取数据

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读入文件,转置数据帧,咀嚼一点。。。等等 伪造文件的设置: >

通常情况下,数据是以列作为变量显示的,但如果例如我在.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

读入文件,转置数据帧,咀嚼一点。。。等等

伪造文件的设置:

>>> 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