拆分 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
,构建所需的 DataFrame,result
可能更容易
原始数据源。
例如,如果您的原始数据是元组列表的列表:
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
我有一个充满元组的 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
,构建所需的 DataFrame,result
可能更容易
原始数据源。
例如,如果您的原始数据是元组列表的列表:
data = [[(1,2),(3,4)],[(5,6),(7,8)]]
然后可以使用
构建所需的 DataFramedf = 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