bme*_*llo 50 python dataframe pandas
我从某个地方收到了一个DataFrame,并希望创建另一个具有相同数量和列和行(索引)名称的DataFrame.例如,假设原始数据框被创建为
import pandas as pd
df1 = pd.DataFrame([[11,12],[21,22]], columns=['c1','c2'], index=['i1','i2'])
Run Code Online (Sandbox Code Playgroud)
我通过显式定义列和名称来复制结构:
df2 = pd.DataFrame(columns=df1.columns, index=df1.index)
Run Code Online (Sandbox Code Playgroud)
我不想复制数据,否则我就可以写了df2 = df1.copy().换句话说,在创建df2之后,它必须只包含NaN元素:
In [1]: df1
Out[1]:
c1 c2
i1 11 12
i2 21 22
In [2]: df2
Out[2]:
c1 c2
i1 NaN NaN
i2 NaN NaN
Run Code Online (Sandbox Code Playgroud)
有没有更惯用的方式呢?
ayh*_*han 36
这是一份工作reindex_like.从原始开始:
df1 = pd.DataFrame([[11, 12], [21, 22]], columns=['c1', 'c2'], index=['i1', 'i2'])
Run Code Online (Sandbox Code Playgroud)
构造一个空的DataFrame并像df1一样重新索引它:
pd.DataFrame().reindex_like(df1)
Out:
c1 c2
i1 NaN NaN
i2 NaN NaN
Run Code Online (Sandbox Code Playgroud)
fir*_*ynx 29
在0.18版本的pandas中,DataFrame构造函数没有选项来创建数据框,就像使用NaN而不是值来创建另一个数据框一样.
您使用的代码df2 = pd.DataFrame(columns=df1.columns, index=df1.index)是最合乎逻辑的方式,改进它的唯一方法是拼出更多您要做的是添加data=None,以便其他编码人员直接看到您故意从这个新的DataFrame中省略数据创建.
TLDR:所以我的建议是:
df2 = pd.DataFrame(data=None, columns=df1.columns, index=df1.index)
Run Code Online (Sandbox Code Playgroud)
非常像你的,但更详细说明.
小智 11
我的情况是创建一个没有 data 和 index的数据框的副本。可以通过执行以下操作来实现这一点。这将保持列的 dtypes。
empty_copy = df.drop(df.index)
Run Code Online (Sandbox Code Playgroud)
Ped*_*rte 10
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[1, 'a'], [2, 'b'], [3, 'c']],
...: columns=['num', 'char'])
In [3]: df
Out[3]:
num char
0 1 a
1 2 b
2 3 c
In [4]: df.dtypes
Out[4]:
num int64
char object
dtype: object
Run Code Online (Sandbox Code Playgroud)
DataFrame原始列的简单初始化,DataFrame但不提供数据:In [5]: empty_copy_1 = pd.DataFrame(data=None, columns=df.columns)
In [6]: empty_copy_1
Out[6]:
Empty DataFrame
Columns: [num, char]
Index: []
In [7]: empty_copy_1.dtypes
Out[7]:
num object
char object
dtype: object
Run Code Online (Sandbox Code Playgroud)
如您所见,列数据类型与原始数据类型不同DataFrame.
dtype......如果你想保留列的数据类型,你需要构造DataFrame一个Series在同一时间
In [8]: empty_copy_2 = pd.DataFrame.from_items([
...: (name, pd.Series(data=None, dtype=series.dtype))
...: for name, series in df.iteritems()])
In [9]: empty_copy_2
Out[9]:
Empty DataFrame
Columns: [num, char]
Index: []
In [10]: empty_copy_2.dtypes
Out[10]:
num int64
char object
dtype: object
Run Code Online (Sandbox Code Playgroud)
一个简单的替代方法 - 首先将基本结构或索引和列与原始数据帧(df1)中的数据类型复制到df2
df2 = df1.iloc[0:0]
Run Code Online (Sandbox Code Playgroud)
然后用空行填充数据帧 - 需要调整伪代码以更好地匹配您的实际结构:
s = pd.Series([Nan,Nan,Nan], index=['Col1', 'Col2', 'Col3'])
Run Code Online (Sandbox Code Playgroud)
循环遍历df1中的行
df2 = df2.append(s)
Run Code Online (Sandbox Code Playgroud)