Different Results From R's Survival Library and Python's Lifeline library I have a dataset that I'm trying to perform basic K-M survival analysis on. I initially used the Python package lifelines to perform the analysis. To double check my results, I also then used the Survival package in R. However, I surprisingly received completely different results for the confidence interval of the median survival time.
The dataset is very small: 

As you can see it consists of 10 durations and 10 logical variables that indicate whether the event occurred or not (1 indicates that the event - death - was observed). 
In lifelines, I get the following results.

With the following survival curve.

I was extremely confused because the lower confidence interval was 0 in the output despite not being so in the graph itself. This is my first question: how can the 95% CI lower bound be 0 in a calculation but not be so in the graph? 
To add to my confusion, I then re-did the analysis in R. Here's what I got: 

As you can see, now there is a lower bound on the CI, but not an upper bound.
I'm extremely confused and any help would be appreciated.
Things I've already tried:
1. I double checked to make sure that the data being used by both function is exactly the same. 
2. I also double checked to make sure formats were correct. 
3. I also actually visualized the point estimates of survival and they are the same between the 2 programs. So it appears that there is a difference in how lifelines and Survival calculate confidence intervals.
Edit: I looked into different ways of calculating confidence intervals for point estimates in KM analysis, and it appears that Lifelines uses the Greenwood formula, while the R Survival package doesn't. So I switched the R survival package to use the Greenwood intervals. 
os_fit = survfit(km_os ~ 1, data = data, conf.type = 'plain')
ggsurvplot(os_fit, data = data, conf.int = TRUE, risk.table = TRUE, xlab = "Months", ggtheme = theme_light()) + ggtitle('Overall Survival') 

This resulted in:

The good news is that the upper bound now matches between Lifelines and Survival. But the Lower Bound is still 28.9 for R's Survival, while the LB for lifelines is 0. 
Edit #2: Was asked to post Survival Curves from R as well. 

Edit: Adding code. Note I've removed things like filenames to protect sensitive data. 
Using Lifelines version: '0.22.3'. 

import lifelines
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from lifelines.utils import median_survival_times

df = pd.read_csv('filename.csv')
T_OS = list(df['OS'])
E_OS = list(df['OS Censor'])
T_PFS = list(df['PFS'])
E_PFS = list(df['rPFS Censor'])

#PFS is the same type of duration + observed data, but for a different #survival metric

fig1  = plt.figure(figsize=(15,10))
ax = fig1.add_subplot(111)

kmf = lifelines.KaplanMeierFitter()
kmf.fit(T_OS, event_observed=E_OS)
kmf.plot(ax = ax, color='b', ls='solid', ci_show=True, linewidth=4)
plt.title('Overall Survival', fontsize = 22)
plt.xlabel("Months", fontsize = 18)
plt.ylabel("Percent Survival", fontsize = 18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.grid()
fig1.savefig('mOS.png')

## I was using a jupyter notebook, so what follows is a different cell. 


print("Median OS", kmf.median_)
print(median_survival_times(kmf.confidence_interval_))
print(kmf.event_table)
print(kmf.survival_function_)


Also here is the object types for the dataframe columns: 

Thanks so much in advance!
 A: Here is a somewhat tangential answer that might help you think about the issue (it doesn't address the discrepancies between packages though). Too long to add as a comment so I'm noting it here.
Confidence intervals for the survival function of the Kaplan-Meier curves are calculated at the time of each event (so you get the same type of step function that you get for the point estimates of the curve). 
The confidence intervals for the median survival time are then taken from the survival curve (at least in the instances of which I'm aware). So the lower bound for median survival is the first time at which the lower confidence bound of the survival function drops below 50%; and the upper bound for median survival is the first time at which the upper bound of the survival function drops below 50%. 
You can see this in your first graph from Python, wherethe upper CI for the survival function drops below 50% at 48 months. It's clearer for both lower and upper bounds in the R plotted figure.
This helps explain why bounds for the median survival time are sometimes missing: if the (upper bound) for the confidence interval for the survival function never drops below 50% then the upper bound of the confidence interval for median survival time will be undefined.
