将 pandas 个数据帧列表连接在一起
Concatenate a list of pandas dataframes together
我有一个 Pandas 数据帧列表,我想将它们组合成一个 Pandas 数据帧。我正在使用 Python 2.7.10 和 Pandas 0.16.2
我创建了数据帧列表:
import pandas as pd
dfs = []
sqlall = "select * from mytable"
for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
dfs.append(chunk)
这个returns数据帧列表
type(dfs[0])
Out[6]: pandas.core.frame.DataFrame
type(dfs)
Out[7]: list
len(dfs)
Out[8]: 408
这是一些示例数据
# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., 12.]})
# list of dataframes
mydfs = [d1, d2, d3]
我想将 d1
、d2
和 d3
合并到一个 pandas 数据帧中。或者,在使用 chunksize
选项时将大 table 直接读入数据帧的方法会非常有帮助。
鉴于所有数据框都有相同的列,您可以简单地 concat
它们:
import pandas as pd
df = pd.concat(list_of_dataframes)
如果数据框并非都具有相同的列,请尝试以下操作:
df = pd.DataFrame.from_dict(map(dict,df_list))
你也可以用函数式编程来实现:
from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
concat
也可以很好地与使用 "loc" 命令对现有数据框
拉出的列表理解一起使用
df = pd.read_csv('./data.csv') # ie; Dataframe pulled from csv file with a "userID" column
review_ids = ['1','2','3'] # ie; ID values to grab from DataFrame
# Gets rows in df where IDs match in the userID column and combines them
dfa = pd.concat([df.loc[df['userID'] == x] for x in review_ids])
再补充一些细节:
示例:
list1 = [df1, df2, df3]
import pandas as pd
按行串联并忽略索引
pd.concat(list1, axis=0, ignore_index=True)
注意:如果列名不相同,则NaN将被插入到不同的列值
按列串联并希望保留列名
pd.concat(list1, axis=1, ignore_index=False)
如果ignore_index=True,列名将填充从0到(n-1)的数字,其中n是唯一列名称的计数
panders concat
除了 functools
之外也同样有效
from functors import reduce as reduce
import pandas as pd;
deaf = pd.read_csv("http://www.aol.com/users/data.csv")
for q in range(0, Len(deaf)):
new = map(lambda x: reduce(pd.concat(x))
我有一个 Pandas 数据帧列表,我想将它们组合成一个 Pandas 数据帧。我正在使用 Python 2.7.10 和 Pandas 0.16.2
我创建了数据帧列表:
import pandas as pd
dfs = []
sqlall = "select * from mytable"
for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
dfs.append(chunk)
这个returns数据帧列表
type(dfs[0])
Out[6]: pandas.core.frame.DataFrame
type(dfs)
Out[7]: list
len(dfs)
Out[8]: 408
这是一些示例数据
# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., 12.]})
# list of dataframes
mydfs = [d1, d2, d3]
我想将 d1
、d2
和 d3
合并到一个 pandas 数据帧中。或者,在使用 chunksize
选项时将大 table 直接读入数据帧的方法会非常有帮助。
鉴于所有数据框都有相同的列,您可以简单地 concat
它们:
import pandas as pd
df = pd.concat(list_of_dataframes)
如果数据框并非都具有相同的列,请尝试以下操作:
df = pd.DataFrame.from_dict(map(dict,df_list))
你也可以用函数式编程来实现:
from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
concat
也可以很好地与使用 "loc" 命令对现有数据框
df = pd.read_csv('./data.csv') # ie; Dataframe pulled from csv file with a "userID" column
review_ids = ['1','2','3'] # ie; ID values to grab from DataFrame
# Gets rows in df where IDs match in the userID column and combines them
dfa = pd.concat([df.loc[df['userID'] == x] for x in review_ids])
再补充一些细节:
示例:
list1 = [df1, df2, df3]
import pandas as pd
按行串联并忽略索引
pd.concat(list1, axis=0, ignore_index=True)
注意:如果列名不相同,则NaN将被插入到不同的列值
按列串联并希望保留列名
pd.concat(list1, axis=1, ignore_index=False)
如果ignore_index=True,列名将填充从0到(n-1)的数字,其中n是唯一列名称的计数
panders concat
除了 functools
from functors import reduce as reduce
import pandas as pd;
deaf = pd.read_csv("http://www.aol.com/users/data.csv")
for q in range(0, Len(deaf)):
new = map(lambda x: reduce(pd.concat(x))