迭代创建 pandas 数据框
creating a pandas dataframe iteratively
我有 703 个制表符分隔的文本文件,形状为 (X,4),其中 X 可以是任何正数,最大值为 217632347。例如,其中三个文件如下所示:
###File ID_739.txt
region latitude department product
NY 71 HR -
###File ID_618.txt
region latitude department product
LA 91 R&D -
###File ID_917.txt
region latitude department product
NY 71 HR
我想要一个数据框(可能是 pandas 或 numpy),它看起来像:
region latitude ID_739 ID_618 ID_917
NY 71 1 0 1
LA 91 0 1 0
所以在某种程度上我正在寻找单热编码,我将一个编码放在区域和纬度相同的列下。例如 ID_739 和 ID_917 具有相同的区域和纬度,因此它们得到 1 而 ID_618 得到零。我有 703 个文件,这意味着我的最终数据框的形状为 (X,705)。是705是因为每个文件变成了列+区域+纬度。考虑到每个文本文件中都有很多行,我怎样才能有效地做到这一点?将不胜感激。
首先通过文件名创建带有列 New
的大 DataFrame,然后聚合 join
,因此可以通过 Series.str.get_dummies
:
使用 one-hot encoding
import glob
files = glob.glob('files/*.txt')
dfs = [pd.read_csv(fp).assign(New=os.path.basename(fp).split('.')[0]) for fp in files]
df = (pd.concat(dfs, ignore_index=True)
.groupby(['region','latitude'])['New']
.agg('|'.join)
.str.get_dummies()
.reset_index())
print (df)
region latitude ID_618 ID_739 ID_917
0 LA 91 1 0 0
1 NY 71 0 1 1
假设您的文件在当前目录中,您可以使用 glob
读取您的文件并与从“纬度”列获得的虚拟文件合并:
from glob import glob
files = glob('ID_*.txt')
df = pd.concat({f[:-4]: pd.read_csv(f, sep='\s+') for f in files}).droplevel(1)
(df[['region', 'latitude']].merge(pd.get_dummies(df['latitude']).T,
left_on='latitude',
right_index=True,
)
.drop_duplicates('latitude')
)
输出:
region latitude ID_739 ID_917 ID_618
ID_739 NY 71 1 1 0
ID_618 LA 91 0 0 1
我有 703 个制表符分隔的文本文件,形状为 (X,4),其中 X 可以是任何正数,最大值为 217632347。例如,其中三个文件如下所示:
###File ID_739.txt
region latitude department product
NY 71 HR -
###File ID_618.txt
region latitude department product
LA 91 R&D -
###File ID_917.txt
region latitude department product
NY 71 HR
我想要一个数据框(可能是 pandas 或 numpy),它看起来像:
region latitude ID_739 ID_618 ID_917
NY 71 1 0 1
LA 91 0 1 0
所以在某种程度上我正在寻找单热编码,我将一个编码放在区域和纬度相同的列下。例如 ID_739 和 ID_917 具有相同的区域和纬度,因此它们得到 1 而 ID_618 得到零。我有 703 个文件,这意味着我的最终数据框的形状为 (X,705)。是705是因为每个文件变成了列+区域+纬度。考虑到每个文本文件中都有很多行,我怎样才能有效地做到这一点?将不胜感激。
首先通过文件名创建带有列 New
的大 DataFrame,然后聚合 join
,因此可以通过 Series.str.get_dummies
:
one-hot encoding
import glob
files = glob.glob('files/*.txt')
dfs = [pd.read_csv(fp).assign(New=os.path.basename(fp).split('.')[0]) for fp in files]
df = (pd.concat(dfs, ignore_index=True)
.groupby(['region','latitude'])['New']
.agg('|'.join)
.str.get_dummies()
.reset_index())
print (df)
region latitude ID_618 ID_739 ID_917
0 LA 91 1 0 0
1 NY 71 0 1 1
假设您的文件在当前目录中,您可以使用 glob
读取您的文件并与从“纬度”列获得的虚拟文件合并:
from glob import glob
files = glob('ID_*.txt')
df = pd.concat({f[:-4]: pd.read_csv(f, sep='\s+') for f in files}).droplevel(1)
(df[['region', 'latitude']].merge(pd.get_dummies(df['latitude']).T,
left_on='latitude',
right_index=True,
)
.drop_duplicates('latitude')
)
输出:
region latitude ID_739 ID_917 ID_618
ID_739 NY 71 1 1 0
ID_618 LA 91 0 0 1