将一系列数据转化为数据框

4
我有一个类似于以下的Series:
A    2
B    3
C    4

一个类似于以下的DataFrame:

    A   B   C
0   1   2   3
1   4   5   6
2   7   8   9

我希望将该系列分配给数据框中的所有行。这是期望的输出:

    A   B   C
0   2   3   4
1   2   3   4
2   2   3   4

当然,我可以做到。
for col in ser.index:
    df[col] = ser[col]

但是有没有更加高效的方法呢?

5个回答

4
使用 pandas.DataFrame.divmul 方法:
df.div(df).mul(s)

如果df.columns == s.index,则可以使用numpy.tile更快地完成:

pd.DataFrame(np.tile(s, (len(df), 1)), columns=df.columns)

输出:

     A    B    C
0  2.0  3.0  4.0
1  2.0  3.0  4.0
2  2.0  3.0  4.0

2
那是个聪明的答案!! - Bharath M Shetty

2

assign

不进行任何检查,只需将在所有行中找到的s指定给某个列:

df.assign(**s)
#   A  B  C
#0  2  3  4
#1  2  3  4
#2  2  3  4

或者只需从s创建DataFrame,并将您未更新的列连接回来:
pd.concat([df[df.columns.difference(s.index)],
           pd.DataFrame(s.to_dict(), index=df.index)],
          axis=1)

1
df = df.replace(df, ser)

df = df.apply(lambda x : ser, axis=1)

例子:
使用 pandas.DataFrame.applylambda函数,并设置 axis = 1

>>> df = pd.DataFrame({'A':[1,4,7],'B':[2,5,8],'C':[3,6,9]})
>>> ser = pd.Series({'A':2,'B':3,'C':4})

>>> df = df.apply(lambda x : ser, axis=1)

>>> df
   A  B  C
0  2  3  4
1  2  3  4
2  2  3  4

第二种解决方案:
>>> df = df.replace(df, ser)
>>> df
   A  B  C
0  2  3  4
1  2  3  4
2  2  3  4

0

非常快速,即使对于大型的 df,只要您的 df 列与您的序列索引相同,并使用 numpy 广播:

df.loc [:,:] = ser.to_numpy()[None, :]

None 告诉它广播(复制-填充)以匹配正在处理的内容。


-1
一个没有循环的解决方案,不确定是否真的更高效。
import pandas as pd
import numpy as np
DF = pd.DataFrame({
                   'A':[1,4,7],
                   'B': [2,5,8],
                   'C': [3,6,9]})
ser = pd.Series([2,3,4], index =['A','B','C'])

首先将Pandas系列转换为字典

dict=ser.to_dict()

然后在数据框中的每个位置放置 null 值:

DF.loc[:,:] = np.NaN

最后使用fillna方法,使用dict指定要在每个列中放置的值。
DF.fillna(dict) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接