迭代创建 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