Python 熊猫:有效地将一行拆分为多行

Python 熊猫:有效地将一行拆分为多行,python,numpy,pandas,Python,Numpy,Pandas,我目前面临的问题是获取一个pandas数据帧,高效地获取每条记录,并按以下方式将其分解为多条记录: 输入: In [16]: pd.DataFrame({'Name': 'Person1', 'State': 'Indiana', 'Money1': 100.42, 'Money2':54.54, 'Money3': 23.45}, index=[1]) Out[16]: Money1 Money2 Money3 Name State 1 100.42 54.54

我目前面临的问题是获取一个pandas数据帧,高效地获取每条记录,并按以下方式将其分解为多条记录:

输入:

In [16]: pd.DataFrame({'Name': 'Person1', 'State': 'Indiana', 'Money1': 100.42, 'Money2':54.54, 'Money3': 23.45}, index=[1])
Out[16]: 
   Money1  Money2  Money3  Name     State
1  100.42  54.54   23.45   Person1  Indiana
输出:

   Money1  Money2  Money3  Name     State
1  100.42  np.nan  np.nan  Person1  Indiana 
2  np.nan  54.54   np.nan  Person1  Indiana      
3  np.nan  np.nan  23.45   Person1  Indiana
基本上,问题是将原始记录拆分为x个记录,其中x是要拆分的传入列的列表(在本例中为“Money1”、“Money2”、“Money3”)。我尝试通过创建数据帧并将其合并来实现这一点,但这非常慢,内存效率也非常低

编辑1:

请注意,如果您的静态列(转换为多索引的列)中有一列都充满了NaN,那么答案就不起作用。这是熊猫中报告的错误:


例如,使用
fillna
replace
将完全由
NaN
组成的列填充为空字符串
'
,然后在此过程之后,将
NaN
放回。

这适用于具有任意列数的数据帧

df = pd.DataFrame({'Name': ['Person1', 'Person2'], 
                   'State': ['Indiana', 'NY'], 
                   'Money1': [100.42, 200], 
                   'Money2': [54.54, 25], 
                   'Money3': [23.45, 10]})

index_cols = ['Name', 'State']
cols = [c for c in df if c not in index_cols]

df2 = df.set_index(index_cols).stack().reset_index(level=2, drop=True).to_frame('Value')

df2 = pd.concat([pd.Series([v if i % len(cols) == n else np.nan 
                            for i, v in enumerate(df2.Value)], name=col) 
                 for n, col in enumerate(cols)], axis=1).set_index(df2.index)

>>> df2.reset_index()
      Name    State  Money1  Money2  Money3
0  Person1  Indiana       1     NaN     NaN
1  Person1  Indiana     NaN      55     NaN
2  Person1  Indiana     NaN     NaN      23
3  Person2       NY       2     NaN     NaN
4  Person2       NY     NaN      25     NaN
5  Person2       NY     NaN     NaN      10
调用
df2.reset\u index(drop=False)
可以在上述过程之后将其转换为我想要的格式。