拆分 pandas 数据框的 multiple/all 列

Splitting multiple/all columns of a pandas dataframe

我有一个充满元组的 pandas 数据框(它可能与数组相同),我想将所有列拆分为更多列(每个数组或元组具有相同的长度)。 我们以此为例:

df=pd.DataFrame([[(1,2),(3,4)],[(5,6),(7,8)]], df.columns=['column0', 'column1'])

输出:

    column0 column1  
0   (1, 2)   (3, 4)  
1   (5, 6)   (7, 8)  

我试图在此处构建此解决方案 (),使用表达式的派生词:

df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1})

喜欢

df.column0.apply(lambda s: pd.Series({'feature1':s[0], 'feature2':s[1]})

输出:

       feature1  feature2  
 0         1         2   
 1         5         6   

这是期望的行为。所以它运作良好,但如果我碰巧尝试使用

 df2=df[df.columns].apply(lambda s: pd.Series({'feature1':s[0], 'feature2':s[1]}))

那么 df2 是:

         colonne0 colonne1
 feature1   (1, 2)   (3, 4)   
 feature2   (5, 6)   (7, 8)  

这显然是错误的。我不能在 df 上应用,它输出与 df2 相同的结果。

如何将这种拆分技术应用于整个数据帧,是否有替代方法? 谢谢

IIUC 你可以使用:

df=pd.DataFrame([[(1,2),(3,4)],[(5,6),(7,8)]], columns=['column0', 'column1'])
print (df)
  column0 column1
0  (1, 2)  (3, 4)
1  (5, 6)  (7, 8)


for col in df.columns: 
    df[col]=df[col].apply(lambda s: pd.Series({'feature1':s[0], 'feature2':s[1]}))

print (df)
   column0  column1
0        1        3
1        5        7

您可以将 DataFrame 值提取为 NumPy 数组,使用 IT.chain.from_iterable 从元组中提取整数,然后将数组重塑并重建为新的 DataFrame:

import itertools as IT
import numpy as np
import pandas as pd
df = pd.DataFrame([[(1,2),(3,4)],[(5,6),(7,8)]], columns=['column0', 'column1'])
arr = df.values
arr = np.array(list(IT.chain.from_iterable(arr))).reshape(len(df), -1)
result = pd.DataFrame(arr)

产量

   0  1  2  3
0  1  2  3  4
1  5  6  7  8

顺便说一句,您可能陷入了 XY 陷阱——您要求 X 你真的应该寻找 Y。而不是试图将 df 转换为 result,构建所需的 DataFrameresult 可能更容易 原始数据源。

例如,如果您的原始数据是元组列表的列表:

data = [[(1,2),(3,4)],[(5,6),(7,8)]]

然后可以使用

构建所需的 DataFrame
df = pd.DataFrame(np.array(data).reshape(2,-1))
#    0  1  2  3
# 0  1  2  3  4
# 1  5  6  7  8

一旦您的 DataFrame 中包含非 NumPy 原生数据类型 (比如元组),你注定要使用至少一个Python循环来提取 来自元组的整数。 (我正在考虑 df.apply(func)list(IT.chain.from_iterable(arr)) 本质上是 Python 循环,因为它们有效 以 Python-循环速度。)

您可以遍历要拆分的每一列并将新列分配给您的 DataFrame:

import pandas as pd

df=pd.DataFrame( [ [ (1,2), (3,4)],
                   [ (5,6), (7,8)] ], columns=['column0', 'column1'])

# empty DataFrame
df2 = pd.DataFrame()

for col in df.columns:
    # names of new columns
    feature_columns  = [ "{col}_feature1".format(col=col), "{col}_feature2".format(col=col) ]
    # split current column
    df2[ feature_columns ] = df[ col ].apply(lambda s: pd.Series({ feature_columns[0]: s[0],
                                                                   feature_columns[1]: s[1]} ) )

print df2

这给出了

  column0_feature1  column0_feature2  column1_feature1  column2_feature2
0                1                 2                 3                 4 
1                5                 6                 7                 8