pandas 创建以 Dataframe 列和系列值为条件的新 Dataframe

bzzcjhmw  于 2023-03-11  发布在  其他
关注(0)|答案(2)|浏览(207)

假设df的索引为t1、t2、t3,列为A、B、C、D、E,还有一个序列的索引为t1、t2、t3,其值为

t1 [A, B, C]
t2 [D, E]
t3 [B, C, D]

如何创建一个新的 Dataframe ,例如索引t1、t2、t3和列A、B、C、D、E,使 Dataframe 中的每个值取决于列值是否在序列的列表中。

A B C D E
t1 T T T F F
t2 F F F T T
t3 F T T T F

我知道 Dataframe 有apply和transform这样的函数,但这些函数通常应用于 Dataframe 的每个值,而不是列值本身。

8ehkhllq

8ehkhllq1#

您可以将Series和assign分解为新列val,然后将set_indexunstack分解为A..E值列,以将其转换为列标题

out = (s.explode().to_frame('col').assign(val='T')
       .set_index('col', append=True).unstack('col', fill_value='F')
       .droplevel(level=0, axis=1).rename_axis('', axis=1))
print(out)

     A  B  C  D  E
t1   T  T  T  F  F
t2   F  F  F  T  T
t3   F  T  T  T  F

或者您可以使用pd.crosstab执行此操作
一个二个一个一个
或使用Series.str.get_dummies

out = s.str.join(',').str.get_dummies(sep=',')
print(out)

    A  B  C  D  E
t1  1  1  1  0  0
t2  0  0  0  1  1
t3  0  1  1  1  0
drkbr07n

drkbr07n2#

解决方案

更容易理解的方法。
1.获取原始系列的索引(index = series_t.index
1.设置新 Dataframe 的列(columns = ['A', 'B', 'C', 'D', 'E']
1.创建一个空 Dataframe (df = pd.DataFrame(index=index, columns=columns)
1.使用for循环和if语句设置dataFrame(df)的每个值

代码

import pandas as pd

# create original series
series_t = pd.Series(index=['t1', 't2', 't3'], data=[['A', 'B', 'C'], ['D', 'E'], ['B', 'C', 'D']])
print(series_t)

print('----------------------------------------------')

# create the new dataFrame from the original series
index = series_t.index
columns = ['A', 'B', 'C', 'D', 'E']
df = pd.DataFrame(index=index, columns=columns)
for i in index:
    for j in columns:
        if (j in series_t[i]):
            df[j][i] = 'T'
        else:
            df[j][i] = 'F'
print(df)

产出

t1    [A, B, C]
t2       [D, E]
t3    [B, C, D]
dtype: object
----------------------------------------------
    A  B  C  D  E
t1  T  T  T  F  F
t2  F  F  F  T  T
t3  F  T  T  T  F

相关问题