gpt4 book ai didi

python - 连接新元数据并复制到所有行的最佳方式(Pandas)

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:38 26 4
gpt4 key购买 nike

我是 Pandas 的新手。这应该很容易,但我的方法似乎不是最佳方法。

我有一个包含多行和多列的虚拟数据框。接下来,我想包含一些具有单个值(一行)的元数据的新列。我想将其作为新列包括在内,并且我想将这些值复制到所有现有行(这将使以后对数据进行一些操作变得更加容易)。

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

df2 = pd.DataFrame({'LAT': ['LAT0'],
'LON': ['LON0'],
'TIME': ['T0']},
index=[0])

我想要一个包含 4 行和 7 列(LAT、LON、TIME、A、B、C、D)的数据框。我希望对每一行重复 LAT、LON 和 TIME 的值。

我的做法是:

df.insert(loc=0, column=['LAT'], value=df2['LAT'][0])

并重复 df2 中的每个变量。这看起来很愚蠢,而且不是正确的方法。此外,我可以:

df2.append(df1)

但这并没有复制这些值。它充满了 NaN。

执行这种简单的单行数据连接和复制的最佳方法是什么?

最佳答案

最简单的是使用assign用字典解包 ** 用于添加新列,但必须是一个单词字符串列:

df1 = df1.assign(**df2.iloc[0])
print (df1)
A B C D LAT LON TIME
0 A0 B0 C0 D0 LAT0 LON0 T0
1 A1 B1 C1 D1 LAT0 LON0 T0
2 A2 B2 C2 D2 LAT0 LON0 T0
3 A3 B3 C3 D3 LAT0 LON0 T0

前置列的另一种解决方案是使用 reindexjoin :

df1 = df2.iloc[[0]].reindex(df1.index, method='ffill').join(df1)
print (df1)

LAT LON TIME A B C D
0 LAT0 LON0 T0 A0 B0 C0 D0
1 LAT0 LON0 T0 A1 B1 C1 D1
2 LAT0 LON0 T0 A2 B2 C2 D2
3 LAT0 LON0 T0 A3 B3 C3 D3

DataFrame 构造函数非常相似:

df3 = pd.DataFrame(df2.iloc[0].to_dict(), index=df1.index)
print (df3)
LAT LON TIME
0 LAT0 LON0 T0
1 LAT0 LON0 T0
2 LAT0 LON0 T0
3 LAT0 LON0 T0

df1 = df3.join(df1)
print (df1)
LAT LON TIME A B C D
0 LAT0 LON0 T0 A0 B0 C0 D0
1 LAT0 LON0 T0 A1 B1 C1 D1
2 LAT0 LON0 T0 A2 B2 C2 D2
3 LAT0 LON0 T0 A3 B3 C3 D3

另一个带有 numpy.broadcast_to 的 numpy 解决方案- 只有当并非所有列都具有相同类型(如字符串)时才要小心,应该应用一些强制转换:

df3 = pd.DataFrame(np.broadcast_to(df2.values, (len(df1),len(df2.columns))),
columns=df2.columns, index=df1.index)
print (df3)
LAT LON TIME
0 LAT0 LON0 T0
1 LAT0 LON0 T0
2 LAT0 LON0 T0
3 LAT0 LON0 T0

df1 = df3.join(df1)
print (df1)

LAT LON TIME A B C D
0 LAT0 LON0 T0 A0 B0 C0 D0
1 LAT0 LON0 T0 A1 B1 C1 D1
2 LAT0 LON0 T0 A2 B2 C2 D2
3 LAT0 LON0 T0 A3 B3 C3 D3

性能:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

#[400000 rows x 4 columns]
df1 = pd.concat([df1] * 100000, ignore_index=True)

df2 = pd.DataFrame({'LAT': ['LAT0'],
'LON': ['LON0'],
'TIME': ['T0']},
index=[0])



In [286]: %timeit df1.assign(**df2.iloc[0])
23 ms ± 642 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [287]: %timeit df2.iloc[[0]].reindex(df1.index, method='ffill').join(df1)
35.7 ms ± 3.78 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [288]: %timeit pd.DataFrame(df2.iloc[0].to_dict(), index=df1.index).join(df1)
54.7 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [289]: %timeit pd.DataFrame(np.broadcast_to(df2.values, (len(df1),len(df2.columns))), columns=df2.columns, index=df1.index).join(df1)
27.8 ms ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

#bunji solution
In [290]: %timeit df1.join(df2, how='outer').fillna(method='ffill')
244 ms ± 19.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 连接新元数据并复制到所有行的最佳方式(Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com