Python:展平存储在数据框中的单个浮点列表的列表

时间:2019-09-18 11:53:05

标签: python pandas list

我使用pyodbc将一些数据加载到熊猫数据框。该数据库包含单个浮点数的列表。给定的数据帧名称为dftype(df.iloc[0][0]type(df.iloc[0][0][0]list作为输出,当type(df.iloc[0][0][0][0]float时。 我需要将这些列表放平,以便仅获取数字,最后只包含一个数字列表,而不是一个列表列表。

为了可视化,这里是保存在df.iloc[0][0]中的内容:

[[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [32.09984], [0.0], [0.0], [0.0], [0.0], [0.0], [0.40704], [0.40704], [32.09984], [32.061440000000005], [32.048640000000006], [32.01024], [0.49152000000000007], [0.0], [0.00256], [0.00512], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]

有什么想法吗?谢谢

3 个答案:

答案 0 :(得分:0)

如果您不介意使用numpy数组,则可以执行以下操作:

df.iloc[0][0] = numpy.array(df.iloc[0][0]).flatten()

或此处的代码用于整列

df["Column"] = df["Column"].apply(lambda x : np.array(x).flatten())

,如果以后需要将您的数据作为列表:

df["Column"] = df["Column"].apply(lambda x : list(np.array(x).flatten()))

对于所有列:

for col in df.columns:
   if col not in ["ColumnThatShouldNotBeTransformed1", "ColumnThatShouldNotBeTransformed2"]:
        df[col] = df[col].apply(lambda x : np.array(x).flatten())

答案 1 :(得分:0)

如果所有子列表都包含单个元素:

>>> x = [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [32.09984], [0.0], [0.0], [0.0], [0.0], [0.0], [0.40704], [0.40704], [32.09984], [32.061440000000005], [32.048640000000006], [32.01024], [0.49152000000000007], [0.0], [0.00256], [0.00512], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]

>>> list(map(lambda a:a[0],x))

否则:

>>> from itertools import chain

>>> list(chain(*x))

x替换为df.iloc[0][0]

答案 2 :(得分:0)

从熊猫0.25开始,您可以尝试df.explode()

mcve:

# ltest = [[0], [314], [42]]
# df = pd.DataFrame([[ltest, ltest, ltest], [ltest, ltest, ltest]], columns=['A', 'B', 'C'])

#                     A                   B                   C
# 0  [[0], [314], [42]]  [[0], [314], [42]]  [[0], [314], [42]]
# 1  [[0], [314], [42]]  [[0], [314], [42]]  [[0], [314], [42]]

方法:
创建新的数据框:

df_new = pd.DataFrame()
for c in df.columns:
    df_new[c] = df[c].explode().str.get(0)

#      A    B    C
# 0    0    0    0
# 0  314  314  314
# 0   42   42   42
# 1    0    0    0
# 1  314  314  314
# 1   42   42   42

索引不再唯一->创建多重索引:

ct = df_new.groupby(df_new.index).cumcount()

# 0    0
# 0    1
# 0    2
# 1    0
# 1    1
# 1    2
# dtype: int64

df_new.index = pd.MultiIndex.from_arrays([df_new.index, ct])

结果:

#        A    B    C
# 0 0    0    0    0
#   1  314  314  314
#   2   42   42   42
# 1 0    0    0    0
#   1  314  314  314
#   2   42   42   42

或根据喜好将以前的子列表元素作为行:

df_new.unstack()

#    A           B           C         
#    0    1   2  0    1   2  0    1   2
# 0  0  314  42  0  314  42  0  314  42
# 1  0  314  42  0  314  42  0  314  42

现在您可以像往常一样使用Pandas索引这些数据,只需注意multiindex需要一个元组:

df_new.loc[0, 1]

# A    314
# B    314
# C    314
# Name: (0, 1), dtype: int64


df_new.loc[(0, 2), 'B']

# 42


df_new.loc[(0, slice(None)), 'B']

# 0  0      0
#    1    314
#    2     42
# Name: 1, dtype: int64